상세 컨텐츠

본문 제목

61일차. DB 14 - 모델링 (2정규화, 4정규화, 제약조건 - 도메인(NOT NULL, DEFAULT, CHECK), 엔티티(PRIMARY KEY, UNIQUE))

수업 일지/Oracle DBMS

by NayC 2021. 5. 17. 09:34

본문

728x90

개념 설계 - 어떤 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) '이미지'는 첨부하는! 개념일때만 컬럼을 넣어준다. 

- 아티클 내에 포함되면 이미지라면 컬럼 필요하지 않음

 

2조거 - 공지를 우리조에도 추가해줘야겠다!
5조거
3조거


 

자료형 결정해야

 

제약 조건 결부되어야 함

 

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() 구나

cf) files에 null 값이 많아서 test files로 다 넣어주었다. 

 

// 내가 맡은 테이블에서 제약 조건을 넣어줘보자

 

정규식을 쓸 때는 아래처럼! 

- 나는 정말 정규식'만' 썼었음 처음에... ㅎㅎ

cf) 내 예시가 PHONE이었음 

 


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 제약조건

 

 

 

 

 

728x90
반응형

관련글 더보기