코드스테이츠 - ERD, 제약조건

kwak woojong·2022년 6월 13일
0

코드스테이츠

목록 보기
22/36
post-thumbnail

ERD

Entity Relationship Diagram (ERD) 는 시스템의 인티티들이 무엇이 있는지, 관계가 어떤지를 나타내는 다이어그램이다.

한 눈에 DB 구성이 어떤지, 필드는 무엇이 있는지, 어떤 필드가 연결되어 있는지 확인할 수 있다.

이 ERD가 있어야 DB 설계를 쉬이 할 수 있을듯 하다.

CLI 대충 던져놓고 머리 속으로 그리는 방법은 분명 한계가 있다.

ERD 사이트

  1. ERDCloud (www.erdcloud.com)

포토삽 툴처럼 직접 엔티티를 넣고 하나하나 필드를 작성할 수 있다.

관계 정리도 클릭 두어번이면 끝나니까 매우 편함.

특히 강한 기능이라고 한다면, sql문을 직접 작성할 필요가 없다는 점이다.

그림을 다 그리고 나면 Export로 sql문을 뜯을 수 있다. 캬캬캬

  1. dbdiagram (https://dbdiagram.io/)

자체 언어를 사용해서 DB 다이어그램을 쉽게 만들 수 있다. 물론 SQL문을 직접 작성하는것도 가능하다.

반응 속도가 상당히 빠르고 엔티티가 깔끔하게 나온다.

직접 SQL문을 작성하는걸 선호한다면 아주 좋을듯.

역시 Export로 sql문을 뺄 수 있다.


제약조건

데이터의 무결성을 지키기 위해, 데이터를 입력 받을 때 실행되는 검사 규칙을 의미한다.
CREAT 문으로 데이터를 생성할 때나, ALTER 문으로 필드를 추가할 때도 설정할 수 있다.

NOT NULL

NOT NULL 제약 조건을 설정하면, 해당 필드는 NULL 값을 저장할 수 없다.
즉, 이 제약 조건이 설정된 필드는 무조건 데이터를 가지고 있어야 한다.

CREATE TABLE Test
(
    ID INT NOT NULL,
    Name VARCHAR(30),
    ReserveDate DATE,
    RoomNum INT
);
  • ALTER 문으로 추가하며 설정하려면
ALTER TABLE 테이블이름
ADD 필드이름 필드타입 NOT NULL
  • ALTER 문으로 기존 필드를 수정하려면
ALTER TABLE 테이블이름
MODIFY COLUMIN 필드이름 필드타입 NOT NULL

UNIQUE

UNIQUE 제약 조건을 설정하면, 해당 필드는 서로 다른 값을 가져야 한다.
이 제약 조건이 설정된 필드는 중복된 값을 가질 수 없다.

CREATE TABLE Test 
(
    ID INT UNIQUE,
    Name VARCHAR(30),
    ReserveDate DATE,
    RoomNum INT
);

지정 방식은 NOT NULL과 똑같다. 걍 옆에 박아주면 끝!

서로 중복값이 없어야 하는 부분에 이게 있으면 좋겠지? 이를테면 유저의 아이디 같은 부분?


PRIMARY KEY

드디어 PK!! Primary key 제약 조건을 설정하면, 해당 필드는 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가진다.

따라서 이 제약 조건이 설정된 필드는 NULL 값을 가질 수 없으며, 또한 중복된 값을 가져서도 안된다.

PK라고도 부른다.

CREATE TABLE Test (
    ID INT PRIMARY KEY,
    Name VARCHAR(30),
    ReserveDate DATE,
    RoomNum INT
);

적용 방법은 똑같다. Primary Key를 적어주면 된다.
역시 ALTER로도 지정이 가능함.

이 PK를 기본으로 보통 관계를 연결한다.


FOREIGN KEY

외래키라고도 부른다. 한 테이블을 다른 테이블과 연결해주는 역할을 한다.
외래키가 설정된 테이블에 레코드를 입력하면, 기준이 되는 테이블의 내용을 참조해서 레코드가 입력된다.
즉, FOREIGN KEY 제약 조건은 하나의 테이블을 다른 테이블에 의존하게 만든다.

FOREIGN KEY 제약 조건을 설정할 때 참조되는 테이블의 필드는 반드시 UNIQUE나 PRIMARY KEY 제약 조건이 설정되어 있어야 한다.

CREATE TABLE Test2 (
    ID INT,
    ParentID INT,
    FOREIGN KEY (ParentID)
    REFERENCES Test1(ID) ON UPDATE CASCADE
);

이전 친구들과는 좀 다르다.
우선 현재 테이블에서 어떤 필드가 FOREIGN KEY인지 선택하고
REFERENCES로 다른 테이블의 필드가 어떤 필든지 선택한다.

FOREIGN KEY는 연결된 값이므로 해당 테이블이 변경 될 경우, 혹은 삭제될 경우 본 필드를 어떻게 해야할지 지정해줘야 한다.

ON DELETE

해당 테이블이 삭제될 경우의 동작은 이 ON DELETE로 설정할 수 있다.

ON UPDATE

해당 테이블이 수정될 경우의 동작은 이 ON UPDATE로 설정할 수 있다.

이 때 설정할 수 있는 동작은 5개가 있다.

  1. CASCADE : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블에서도 삭제와 수정이 같이 이루어진다.

  2. SET NULL : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블 데이터는 NULL로 변경된다.

  3. NO ACTION : 참조되는 테이블에서 데이터를 삭제하거나 수정해도, 참조하는 테이블의 데이터는 변경되지 않는다.

  4. SET DEFAULT : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 필드에 설정된 기본값으로 변경된다.

  5. RESTRICT : 참조하는 테이블에 데이터가 남아 있으면, 참조되는 테이블의 데이터를 삭제하거나 수정할 수 없다.

CREATE TABLE Test2 (
    ID INT,
    ParentID INT, 
    FOREIGN KEY (ParentID)
    REFERENCES Test1(ID) ON UPDATE CASCADE ON DELETE RESTRICT
);

Test2의 ParentID는 test1의 ID값을 참조하고 있다.

test1의 ID가 변경될 시엔 Test2의 ParentID도 수정된다.

DELETE일 경우 RESTRICT로 설정되어 있으므로

Test2의 레코드 중 ParentID가 있는, 즉, test1과 연결되어 있는 레코드는 삭제할 수 없다.


DEFAULT

DEFAULT 제약 조건은 해당 필드의 기본값을 설정할 수 있게 해준다.
만약 레코드를 입력할 때, 해당 필드 값을 전달하지 않으면, 자동으로 설정된 기본값을 저장한다.

CREATE TABLE Test (
    ID INT,
    Name VARCHAR(30) DEFAULT 'Anonymous',
    ReserveDate DATE,
    RoomNum INT
);

name 필드의 기본값으로 Anonymous를 저장한 sql문이다.

profile
https://crazyleader.notion.site/Crazykwak-36c7ffc9d32e4e83b325da26ed8d1728?pvs=4<-- 포트폴리오

0개의 댓글