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
나는 위의 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를 그려낸 후 프로젝트를 시작하니, 수월하게 진행할 수 있었다. 목적지까지 가는 지도를 얻은 기분. 앞으로 프로젝트 전 충분히 생각하고 길을 그려냄으로써 놓치는것 없이 정리된 개발을 하는 개발자가 되어야겠다.
'개발 기초 다지기' 카테고리의 다른 글
알고리즘 문제 (약수의 개수와 덧셈, 문자열 내림차순으로 배치하기) (0) | 2024.05.30 |
---|---|
ORM과 Prisma 그리고 model 만들기 (0) | 2024.05.29 |
내일배움캠프 29일차알고리즘 문제 : 내적 (reduce 함수에 대한 이해) (1) | 2024.05.27 |
내일배움캠프 28일차 : SQL (Structured Query Language) (0) | 2024.05.25 |
내일배움캠프 27일차 : bcrypt 암호화 (0) | 2024.05.23 |
댓글