본문 바로가기
개발 기초 다지기

과제 ERD 작성과 SQL 제약조건

by 너의고래 2024. 5. 29.
반응형

Node.js의 숙련과정의 개인과제인 mysql을 이용한 회원가입, 로그인, 이력서의 CRUD 구현을 진행중이다. 이번에는 지난번 입문과제와 다르게 ERD를 직접 작성해야했다. 그김에 SQL의 제약조건을 함께 복습해보려한다.

 

ERD

그렇다면 ERD가 무엇이냐.

Entity-Relationship Diagram(ERD)로 데이터베이스의 구조를 시각적으로 표현하는 도구다. 주로 소프트웨어 개발자나 데이터베이스 디자이너들이 데이터 모델을 이해하고 설계하는 사용한다. 

ERD 사용하해 데이터베이스의 구조를 시각화하면, 데이터의 관계와 구조를 이해하기 쉽고, 데이터베이스의 설계 유지보수를 용이하게 있다. ERD 통해 데이터베이스의 개념적 모델링과 논리적 모델링을 수행할 있으며, 데이터베이스 시스템을 개발할 중요한 설계 단계 하나이다.

 

ERD는 엔티티(Entity), 속성(Attribute), 관계(Relationship)로 구성된다.

  • 엔티티(Entity)
    •  데이터베이스에서 정보를 저장하는 개체나 사물.
    • 각 엔티티는 고유한 식별자(primary key)를 가지며, 이를 통해 해당 엔티티 식별
    • ex) 사용자, 제품, 주문 등
  • 속성(Attribute)
    • 엔티티가 가지는 특징이나 데이터를 나타냄
    • 엔티티의 각 속성은 해당 엔티티에 저장되는 정보를 설명
    • ex) 사용자 엔티티의 속성 - 이름, 이메일, 나이 등
  • 관계(Relationship)
    • 엔티티간의 연결을 나타냄
    • 일대일, 일대다, 다대다 등의 형태를 가질 수 있음
    • ex) 주문 엔티티와 제품 엔티티 간에는 일대다 관계가 있을 수 있음. 한 주문은 여러 제품을 포함할 수 있음

 

DRAW SQL

 

https://drawsql.app/diagrams

 

https://drawsql.app/login?redirectUrl=https%3A%2F%2Fdrawsql.app%2Fdiagrams

 

drawsql.app

 

나는 위의 DRAW SQL 사이트를 통해 ERD를 그렸다.

이번 과제는 관계가 복잡한 편이 아니기에 userId를 통해 일대다 관계를 구현해내면 됐었다.

위의 ERD에 대한 설명에 대입해보면 아래와 같다.

 

  • 엔티티 : Users, Resume
  • 속성: Users(email, name, role...), Resume(title, content, status...)
  • 관계: User 엔티티와 Resume 엔티티의 관계는 일대다 관계이다. 한명의 유저가 이력서를 여러개 작성할 수 있다.

 

이제 이 ERD에 넣어야했던 SQL 제약조건을 하나씩 정리해보려 한다.

 

 

SQL 제약조건

제약 조건(Constraint)

: 각 컬럼들간의 제한사항을 관리하고, 조건을 위반하는 데이터를 방지하여 데이터베이스의 무결성(Integrity)을 보장하는 규칙.

   → 무결성(Integrity) 데이터가 결함없이 정확하고 완전한 상태

 

 

 제약 조건의 종류

1) 기본 (Primary Key) 제약 조건

: 테이블에 있는 데이터를 고유하게 구분 있는 정보를 나타내기 위해서 사용

 

내가 만든 ERD에서 userId와 resumeId가 여기에 해당한다.

userId를 통해 Users 테이블의 각 행 데이터는 고유한 userId를 가지고 있다.

resumeId를 통해 Resumes 테이블의 각 행 데이터는 고유한 resumeId를 가지고 있다.

 

AUTO_INCREMENT
:데이터를 삽입할 때 아무런 데이터를 입력하지 않더라도 고유한 값을 유지할 수 있도록 도와주는 속성
 DB 내에서 데이터가 입력될 때 마다 숫자를 1씩 증가시켜 기본 키의 고유한 값을 유지시켜줌

내 과제 속에서도 autoincrement()를 사용해 각 테이블에 데이터가 생성될 때 마다 userId와 resumeId가 자동으로 1씩 커지며 고유한 ID 값을 갖게된다.

 

 

2) NULL 제약조건

: 특정 칼럼이 아무런 값을 입력받지 않도록 설정하거나, 무조건 값을 입력 받도록 설정하는 조건

데이터가 없다면, NULL을 저장하여, 데이터가 존재하지 않다는것을 표현

 

내 과제같은 경우 무조건 모든 값을 입력 받도록 설정하였다.

테이블에 모두 NOT NULL제한 조건이 추가되어있다.

 

 

3)고유(Unique) 제약 조건

: 테이블에 소속된 특정 컬럼이 중복된 키를 가질 수 없는 조건

사용자 아이디, 이메일과 같은 고유한 정보를 저장할 때 사용

 

ex) 사용자 테이블의 이메일 열에 고유 제약을 추가하면 모든 사용자의 이메일이 고유해야 한다.

  -> 동일한 이메일 주소를 가진 사용자가 여러 존재하는 것을 방지할 있음

  -> 이러한 제약은 데이터베이스의 데이터 무결성을 유지하는 도움이 됨

 

이메일은 나한테 userId와 같이 로그인 할 때 이 사람이 어떤 사람인지 구별해 내는 신분증같은 느낌이다.

같은 신분증을 가진 사람이 없듯이 이메일은 고유하게 하나만 존재해야한다.

그래서 나도 email에 고유 제약조건을 걸어주었다.

 

4) 외래 키 (Foreign Key) 제약 조건

: 테이블 간의 관계를 설정하는 조건

한 테이블의 컬럼(Column)이 다른 테이블의 특정 행(Row)을 참조하도록 설정하는 조건

 

 

대표적인 연관 관계

  • 1:1 - 1명의 사용자(User)는 1개의 사용자 정보(UserInfo)를 가질 수 있다.
  • 1:N - 1명의 사용자(User)는 여러개의 주문(Order)을 할 수 있다.
  • N:M - 여러명의 학생(Student)은 여러개의 학원(School)을 등록할 수 있다.

 

CREATE TABLE 테이블명
  FOREIGN KEY (컬럼명) REFERENCES 참조_테이블명 (참조_컬럼명)
    ON DELETE [연계 참조 제약 조건]
    ON UPDATE [연계 참조 제약 조건]
);

 

이런식으로 테이블을 만들면서 테이블을 생성함과 동시에 정의

 

내 과제 속에서는 각 테이블의 userId를 통해 외래키를 설정하여 각 유저의 이력서를 참조할 수 있다.

1:N 관계 : 1명의 유저 - 여러개 이력서

 

 

* 참조 무결성 제약조건
: 외래 키의 경우 다른 테이블과 관계를 맺고 있는 참조 데이터가 삭제(DELETE)또는 수정(UPDATE)될 때 어떤 행위를 해야하는지 설정하는 조건

- CASCADE : 참조하고 있는 개체가 변경/삭제 될 경우 함께 변경/삭제
- NO ACTION : 참조하고 있는 개체가 변경/삭제 될 경우 아무런 행위를 하지 않고 에러가 발생 (아무것도 삭제되지 않음)
- SET NULL : 참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 NULL로 변경 (삭제된 값 NULL로 표시)
- SET DEFAULT : 참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 기본 값으로 변경 (삭제된 값 기본값으로 표시)

 

 

이렇게 프로젝트 초반 설계에 필요한 ERD 과정과 ERD를 그려낼 때 필요한 SQL 제약조건에 대해 정리해보았다. ERD같은 경우, 전체 프로젝트에 대한 감이 없는 상태에서 만들어내려니 처음엔 막막했는데 확실히 ERD를 그려낸 후 프로젝트를 시작하니, 수월하게 진행할 수 있었다. 목적지까지 가는 지도를 얻은 기분. 앞으로 프로젝트 전 충분히 생각하고 길을 그려냄으로써 놓치는것 없이 정리된 개발을 하는 개발자가 되어야겠다.

반응형

댓글