61일차. DB 14 - 모델링 (2정규화, 4정규화, 제약조건 - 도메인(NOT NULL, DEFAULT, CHECK), 엔티티(PRIMARY KEY, UNIQUE))
개념 설계 - 어떤 data를 db로 만들 것인지 말그대로 개념 설계
- 네모 박스 -> 테이블이 되고
- 마름모 형태 -> n:n은 무조건 테이블이 되는 것 (슈퍼키)
1:n (n쪽으로 들어가는데 - 등록자 아이디, 등록 일자가 노하우 entity 아래로)
논리 설계 - 데이터를 테이블 형태로 만드는 것
그리고 논리 설계에 오류가 없는지 정규화를 알아봤다. (중복을 제거하자는 것)
Q. 화면 보고 1전규화 위반 찾아보기
공지사항 레코드 하나에
각 컬럼에는 '하나의 컬럼값'만 넣어야 하는 것 (원자성)
- 2개 이상을 가질 가능성이 있으면 중복 발생하게 만드는 녀석이 되어 1정규화 위반이 됨
댓글 내용 선택했으면 댓글 등록 일자를 선택했어야
만약에 댓글을 2개 단다고 하면 컬럼을 저렇게 댓글2, 댓글등록일자2 이렇게 컬럼을 늘려야 함
이게 비효율적인 이유는 : 이거는 "댓글이 몇 개나 달릴까? 한... 100개?" 이렇게 미리! 정해서 컬럼을 미리 마련해두는 것
- 만약 100개 만들었는데 댓글 2개 달리면 98개가 NULL임
컬럼은 유동적인 얘가 아니라서 컬럼으로 데이터 늘리는 작업은 수직!으로 늘려야함
그러면 아이디, 제목, ... 이런게 중복되니까
-> 자른다.
중복 안되는거 따로, 중복 되는거 따로.
- 중복 되는거에는 'FK' 추가 (ex - 1 참조, 1 참조...)
위치 X
* 3정규화 위반 tesr를 해보자~ *
" 어 이 데이터는 이전에 넣었던 데이터가 반복되는 것 같은데...?!"
-> 3정규화 위반
첨부파일명, 첨부파일용도 X
작성자 이름, 작성자 연락처, 등급 O
앞에 넣었던 데이터 중에서 또 들어갈 것 같은거
- '그' 작성자가 다음 공지사항 등록 때 또 들어갈 수도 있으니까
2정규화
- 부분 함수 종속성을 없애는 것
그런데 느닷없이 작성자 이름이 들어온다면?
-> 2정규화 위반
- (댓글의 작성자이름은) 지우고 부모 속성으로 넣어줘야
참조할 수 있는 데이터는 FK를 가지고 참조하기!
말그래도로 '부분 함수' 종속성을 없애주기!
4정규화
- 관계가 N:N일 경우에는 테이블을 따로 만들라는 것
우리는 애초부터 만들었지 ~
// 정규화 끝 >.<
*피드백 받은 부분*
- 원래 분류 아래 문학, 비문학,... 있었는데 이건 테이블 column이 아니라 value값이라서 수정
- '좋아요' 일정 추가하는걸 추천 ('마이 프로필'에서 좋아요 한 목록들 보려면 '정렬 기준'이 필요해서)
- '모임'에 공지사항 추가
- 검색할 때 api 이용하는거 고민해보기
다른 조거 들으며 추가할 부분
- 수정일 추가해줘도 좋을 듯
cf) '이미지'는 첨부하는! 개념일때만 컬럼을 넣어준다.
- 아티클 내에 포함되면 이미지라면 컬럼 필요하지 않음
자료형 결정해야
제약 조건 결부되어야 함
ex) 회원가입 때
- 필수 컬럼 (사용자가 반드시 입력하도록 하는)
데이터 들어오지 않으면 그것도 결함 (있어야 할 데이터가 없으니)
- 옵션 컬럼
- 식별자 컬럼이 중복되는건 큰 결함
- 각 컬럼이 올바르더라도 똑같은 레코드가 또 들어가면 그것도 결함
- 부모의 레코드가 존재하지 않는데 부모거를 참조하면 그것도 결함
-> entity, service 뽑아내기
1) 필수 컬럼 골라내기
- 이거 이거 이거 컬럼은 절대로 null 이 들어가면 안된다
2) 디폴트 컬럼.
- 입력 받지 않지만 반드시 값 있어야 하는 컬럼
ex) 등록일자 등
3) 입력 값에 데이터 체크하는
- 규격이 맞지 않으면 오류내게 하는
간단!
- 뒤에 NOT NULL만 붙이면 됨
NOT NULL 하고 싶으면
테이블 편집 눌러서 > '널이 아님' 체크만 하면 됨!
그리고 DDL을 가면
이렇게 쿼리문을 뽑아낼 수도 있다 :)
// 근데 문제가 있음
하나 더 만들어야 함 (영문 버전)
SQL은 소대문자 구분이 안되어서 _ 로
예약어는 피해야
-> "JOIN"이런식으로 따옴표를 붙여준다.
//
오라클에서 각자 테이블 하나씩 만들기 (제약조건과 함께)
필수 컬럼에 대한걸 설정해주자
- 사용자가 입력해야만 하는거
- 사용자가 입력 안해도 되는거 -> 기본값 설정
현재 날짜 알아내는 함수
SYSTIMESTAMP (SYSDATE + TIMESTAMP 합친거로 날짜, 시간 다 나온다)
-> 기본값이 채워지게 될 것
기본값 들어가는건 INSERT로 안 넣어도 됨
ㅡㅡㅡㅡㅡ
Q. 질문 - ID 대신 식별키를 NICNAME으로 하면 안되느냐
NICNAME도 식별이 되기는 하지만, 내부적으로 식별하는걸 따로 두는게 좋다.
사용자가 했던 행위들에 대해서 기록하기 위함?
회원 탈퇴하는 경우를 생각해보자.
- ID하고 NAME은 놔둬서 사용자가 주문했던 건 놔두는게 일반적이라고 한다.
- 근데 NICNAME을 ID 대신 사용하면,
'이전 회원이 사용했던 ID'라며 탈퇴한 회원의 ID를 새롭게 사용하지 못하는
//
도메인 제약 조건 - NOTNULL, DEFAULR를 배워봤다.
이제 '체크 조약조건'을 알아보자
- 유효하지 않은 폰 번호는 받지 않겠다는 등
제약조건은 '별도의' 데이터베이스 객체로서 등록되는것
- 이름 부여하는데 앞에다가 이름을 부여한다.
그래서 걔만 삭제가 가능하는 등 활용 가능
CONSTRAINT는 부여해도 되고 안해도 된다고 함
제약조건 걸만한걸 찾아보자...
ex) files에 들어오는 내용이 최소한 1~50자라는 조건을 내건다고 하면
우리는 여기에 (PHONE LIKE...) 이 부분만 쓰면 되는 것
문자열 길이 1~50자라고 조건 건다고 한다면
-> 아... 함수식 뭐지 ?
구글링 : ORACLE STRING FUNCTIONS
-> LENGTH() 구나
// 내가 맡은 테이블에서 제약 조건을 넣어줘보자
정규식을 쓸 때는 아래처럼!
- 나는 정말 정규식'만' 썼었음 처음에... ㅎㅎ
entity 제약조건
레코드 단위별로 식별자가 없으면 위에 초록생들 중복된걸 거를 방법이 없다?
-> 모든 레코드는 최소 1개 이상의 '중복이 안되는' 식별자를 넣어 제약을 걸어야 한다는게 바로 entity 제약조건
1) Primary Key
- 이걸 키로 쓰겠다~ 그러니 여기에는 중복되지 않아야 하고 null 이 들어와서도 안돼. 제약조건 걸어줘
2) Unique
- primary key는 하나만 될 수 있음!
- 외부적으로 식별하는건 ID고 내부적으로 중복 허용하지 않는 또 다른 KEY 가 있다면 UNIQUE를 써서 중복을 피하게 / NULL도 아니게 해주는 것
PK 선택만 하면 됨
UNIQUE는
제약조건 클릭 > + > 고유제약조건 > 선택
UNIQUE는 여러개 선택 가능
// 실습 해보고 INSERT로 똑같은 값 넣은게 불가능한지 테스트해보기
2가 있는데, 또 2를 넣어주려고 하면 이 오류가 뜬다. (중복 안되니까!)
지금 중복되지 않은건 좋으나...
자동증가되는 얘로 바꾸고 싶음.
- 사용되지 않는 애를 확인한 다음에 INSERT 하는건 매우 귀찮....
-> 내일은 페이지가 화면에 뜨는거 한다.
cf) entity는 한 줄을 의미
entity 제약 조건은
컬럼에 올바른 값이 올수록 하는게 domain 제약조건
64일 - 트랜잭션 (Transaction. feat. 64일차 총 복습 메모) (0) | 2021.05.21 |
---|---|
64일 - 시퀀스 (Sequence) (0) | 2021.05.21 |
60일차. DB 13 - 모델링 (논리설계 실습) (1) | 2021.05.14 |
59일차. DB 12 - 모델링 (개념설계 실습) (0) | 2021.05.13 |
58일차. DB 11 - 모델링 (개념설계, 논리설계) (0) | 2021.05.12 |