1.DB 모델링
모델링의 특징
- 단순화 : 복잡한 현실 세계를 선택과 집중을 통해 목적에 부합하는 필요한 것만 선택하는 것
- 추상화 : 현실세계의 다양한 현상을 일정한 형식의 표기법으로 관련있는 비슷한 수준끼리 묶어낸 것
- 명확화 : 누구나 쉽게 이해할 수 있게 애매모호함을 제거하고 정확하게 기술하는 것
1-1. 데이터 모델 표기법
IE 표기법 VS 바커 표기법

1-2. 관계형 모델(Relation Model)
- 릴레이션

1-3. 무결성
1-3-1. 무결성이란?
- 무결성은 데이터의 값이 정확한 상태를 의미한다. (완전성과 정확성)
- 정확성은 데이터가 서로 모순이 없이 일관되게 일치해야 함을 의미하는 반면 무결성은 데이터가 완전하고 정확해야한다는 것을 의미하는 것이다.(정합성은 맞지만 실제 데이터는 모두 틀린 값이라면 무결성을 위반한 것)
1-3-2. 무결성 종류 및 설명

2. 관계(Realationship)
2-1. 관계란?
- 두 개 이상의 엔티티 간에 존재하는 연관성을 나타낸다.
- 하위 (자식) 엔티티의 속성으로 관리될 때만 관계를 표현한다.
- 관계에는 종속관계와 참조 관계가 있다.
- 종속관계 : 부모 엔티티와 자식 엔티티 간의 관계로 부모 엔티티가 존재해야 자식 엔티티가 존재할 수 있다. 반대로 말하면 부모 엔티티 없이 관계를 삭제하고 자식 엔티티만 존재할 수 없다.
- 참조관계 : 엔티티간에 연관성이 존재하긴 하지만 다른 엔티티가 없다고 존재할 수 없는 관계는 아니다. 단순히 참조 데이터를 관리하므로 관계를 삭제해도 한 속성에 대한 연관성만 문제가 되고 하위 엔티티 존재에는 지장이 없다.
2-2 관계의 구성요소
2-1-1. 카디널리티(Cardinality)
- 카디널리티는 릴레이션에서 튜플의 개수이자 상위(부모) 엔티티의 인스턴스 하나가 하위(자식) 엔티티의 인스턴스 몇 개와 관련이 있는지 혹은 그 반대를 나타내는 것이다.
- 카디널리티를 통해 관계가 있는 두 엔티티는 일대일(1:1), 일대다(1,M), 다대다(M,M) 관계로 해소해 주어야 한다.
2-1-2. 옵셔널리티(Optionality)
- 상위(부모) 엔티티와 하위(자식) 엔티티가 서로 연관되는 값이 반드시 존재해야 하는지 존재하지 않아도 되는지를 의미한다.
- 서로 연관되는 값이 반드시 존재하면(최소 1개 이상) Mandatory 이다.
- 서로 연관되는 값이 반드시 존재하지 않아도 된다면(최소 0개 이상) Optional이다.
2-2 특별한 관계의 종류
-
일대일 관계(One-to-One Relationship)

-
상위(부모) 엔티티의 하나의 인스턴스가 하위(자식)엔티티의 하나의 인스턴스와 연관되는 관계를 말한다.
-
성능이나 업무 규칙에 의해 일대일 관계를 채택할 수 있다.
-
데이터의 성격이 다르면 업무를 표현하기 위해서 일대일 관계를 채택할 수도 있다.
-
유사한 속성을 과도하게 일대일로 분해하는 것은 유의해야 한다.
-
배타 관계(Exclusive Relationship)
- 두 개 이상의 상위(부모) 엔티티와 관계를 가지며 상호 배타적(하위(자식)엔티티의 하나의 인스턴스가 한번에 하나의 부모 엔티티와 관계를 가지게 됨) 일 때의 관계를 말한다.

- 재귀 관계(Recursive Relationship)
- 하나의 엔티티에서 인스턴스가 같은 엔티티의 다른 인스턴스와 관계를 가진다.
- 주로 계층 구조로 상위와 하위의 개념인 계층 구조(레벨이 존재하는 개념)가 생기는 데이터를 관리하는데 사용되며 엔티티의 개수가 늘어나 조인해야 할 엔티티가 늘어나는 것을 방지해 준다.

3. 논리모델
3-1. 이상이란?
- 중복된 데이터 때문에 데이터에 의도하지 않은 현상이 발생되면 이를 이상현상이라고 한다.
- 이상 현상에는 삽입 이상, 갱신 이상, 삭제 이상이 존재한다.
3-2. 삽입 이상(Addition Anomaly)

- 릴레이션에서 새로운 인스턴스를 삽입할 때 발생하는 데이터 이상 현상이다.
- 불필요한 정보를 함께 저장하지 않고는 어떤 정보를 저장하는 것이 불가능하다.

- 인스턴스 삽입 시 기존의 상품이라도 상품번호, 상품명, 단가를 모두 추가해 주어야 한다.
- 주문이 아닌 상품을 추가하기 위한 인스턴스 추가일 경우 주문번호나 주문 수량이라는 불필요한 속성의 값도 추가하여야 한다.
3-3. 갱신 이상(Update Anomaly)
- 릴레이션에서 속성의 값을 업데이트 할 때 발생하는 데이터 이상 현상이다.
- 반복된 데이터 중에 일부만 수정하면 데이터의 불일치가 발생한다.

상품명이나 단가와 같은 속성의 값들이 변경될 경우 같은 상품은 빠짐없이 모두 수정해 주어야 한다.
3-4. 삭제 이상(Deletion Anomaly)
- 릴레이션에서 인스턴스를 삭제할 때 발생하는 데이터 이상 현상이다.
- 유용한 정보를 함께 삭제하지 않고는 어떤 정보를 삭제하는 것이 불가능하다.

- 주문 내역을 삭제하려고 할 땐 관련 상품도 같이 소멸되어 상품 자체가 사라져 버리게 된다.
4. 정규화
4-1-1. 정규화의 목적
- 중복 데이터를 제거하여 안정성과 확장성을 도모한다.
- 안정성 : 함수 종속을 기반으로 데이터의 성격에 맞는 엔티티가 도출되어 모델 구조를 정의할 수 있다.
- 확장성 : 데이터의 정체성이 그대로 반영되어 업무가 수정되거나 추가 되더라도 엔티티에 반영하기가 수월해 진다.
4-1-2. 함수 종속
- 릴레이션 내에 존재하는 속성 간의 종속성을 의미한다.
- 대표 속성(식별자)이 나머지 속성을 유일하게 식별할 수 있다면 대표 속성과 나머지 속성 사이에는 연관관계가 성립하고 이것을 함수 종속이라고 한다.
- 속성 간의 종속성을 나눌 때 기준이 되는 결정자(Determinant)와 결정자의 값에 의해 유일하게 식별될 수 있는 값을 종속자(Dependent)라고 한다.
- 속성 Y가 속성 X에 의해 함수적으로 종속됨을 표현한 것이다.
- 속성 X의 값을 이용해 속성 Y의 값을 유일하게 식별할 수 있다는 의미로 X의 값에 대해 Y의 값이 오직 하나만 연관되어 있음을 의미한다.
4-2. 정규화의 종류

4-2-1. 제 1정규형(1NF)

- 모든 속성은 반드시 하나의 값을 가져야 한다.(속성은 원자값을 지녀야 한다.)
- 다가 속성(Mutivalued Attributes)과 복합 속성(Composite Attributes) 에 대해 판단하여 처리한다.
- 다가 속성 : 하나의 인스턴스에 하나의 속성이 여러 값을 가지게 되는 속성
- 복합 속성 : 여러 속성이 하나의 속성으로 묶여있는 속성

- (1)의 경우와 같이 속성을 추가해서 인스턴스별로 하나의 속성에 하나의 값이 들어갈 수 있게 할
수 있다. 다만 이렇게 처리할 경우 속성의 갯수가 더 적을 경우가 많거나 추가한 속성의 수보다 많
은 값은 처리할 수 없다. 속성이 한정적이고 제한적으로 존재할 때 처리할 수 있는 방법이다.
- (2)의 경우와 같이 엔터티를 따로 추출해서 1대 다 관계로 처리할 수 있다. 새로 생성된 엔터티의
인스턴스들을 구분하기 위해 속성들을 모두 식별자(복합키)로 활용하는 경우이다. (인스턴스의 구
분 기준을 고려하여 식별자를 선정)
- (3)의 경우는 (2)에서 추가적인 속성으로 인조식별자를 추가하여 인스턴스를 구분하고 나머지 속
성은 비식별자로 처리하는 경우이다.
복합 속성과 관련된 1정규형 처리 방법

- 주소라는 속성은 여러 속성이 하나로 묶인 복합속성의 의미가 될 수 있다.
- 업무상 주소를 구분해서 사용하고자 하는 경우가 많을 때 속성을 구별하며 되려 하나의 주소로 다룰 때가 많을 때는 속성을 구분해서 사용하는 것이 좋지 않다.
4-2-2. 2정규형(2NF)

- 후보 식별자 속성과 일반 속성 간의 종속성을 판단하여 처리한다.
4-2-3. 3정규형(3NF)

- 이행적 종속성(Transitive Dependency) 을 제거하고 일반 속성 간에 종속관계가 없도록 처리한다.
- 일반 속성에 결정자 속성과 종속자 속성이 있는 경우 다른 엔티티로 구별하여 분리한다.
5. 물리 모델
5-1. 물리 모델이란

- 실제로 데이터베이스에 이식할 수 있도록 모델의 구조보다는 인덱스, 뷰, 테이블 타입과 사용하는DBMS와 같은 물리적 요소에 집중하여 데이터베이스를 설계하는 단계이다.
- 성능을 고려해 비정규화(Denormalyzation)를 진행하는 단계이다.

5-2. 물리 모델의 목적
- 성능을 최적화 하기 위해 성능을 고려하여 엔티티를 합치거나 모델 구조를 약간 변경(비정규화) 할 수 있다.
5-3. 물리 모델의 주의사항
- 모델의 구조는 많아도 10% 이내의 변화 정도만 이루어 져야 한다.
- 화면이나 SQL이 작성되면서 필요한 인덱스와 뷰를 도출한다.
- 비정규화는 특정 성능 문제를 해결하기 위한 목적이 아니라면 고려하지 않는다.
- 슈퍼타입과 서브관계의 물리적 변환
6. 비정규화(Denormalization)
6-1. 비정규화란?
- 정규화 작업이 완료된 후 데이터 물리 모델링 과정 중 시스템의 성능 향상, 개발 과정의 편의성, 운영의 단순화를 추구
- 중복은 감수하고 데이터베이스의 성능을 향상시키는 것(특히 검색 속도)
- 정규화를 통한 데이터 무결성 유지도 중요하지만, 다수 사용자가 동시 이용하는 환경에서 일정 성능을 유지하는 것도 매우 중요
수직 분할

- 엔터티의 튜플 수 및 속성의 수가 매우 많고, 엔터티의 속성들이 그룹화되어 각 그룹이 특정 부서
혹은 응용 프로그램에 의해서만 사용될 때
- 엔터티의 데이터량이 많을수록 검색속도는 느려지므로, 엔터티를 분할하여 데이터량을 줄임으로써 성능 향상을 도모할 수 있다.
- 수직 분할은 반복되지는 않지만 속성들이 그룹화 되어 각 그룹이 특정 부서 혹은 응용프로그램에
의해서만 사용될 때에 사용할 수 있으며 수직 분할하면 본래 하나의 엔터티였기 때문에 카디널리
티는 1:1이 된다.
수평 분할

- 튜플의 검색빈도가 다르다는 점을 이용하여 엔터티를 분할하면 엔터티의 데이터 크기가 감소하여 성능 향상의 효과를 볼 수 있다.
- 수평 분할 결과로 나온 엔터티 중 도서정보_A는 자주 검색되는 상위 20%의 도서이고 도서정보
_B는 나머지 80%의 도서이다. 즉, 20%의 책이 전체 검색 빈도의 80%를 차지한다고 생각할 수
있으며 수평분할 된 엔터티는 속성은 동일하지만 서로 아무런 관계도 성립하지 않는다.
속성 중복

- 주문 내역에 주문업체 속성이 중복되게 추가한 것으로 조인을 하지 않고 주문내역으로부터 주문업체 정보를 얻을 수 있다.
- 과도하게 중복된 속성들을 사용하게 되면 데이터의 무결성(데이터의 불일치)이 깨질 수 있다.
- 입력, 수정, 삭제에 있어 응답시간이 늦어질 수 있다.
엔티티 통합

- 항상 혹은 대부분 조인에 의한 검색을 하고, 검색이 빈번히 이루어지는 두 개 이상의 엔터티를 대
상으로 한다.
- 조인 연산에 걸리는 시간을 단축시켜 준다.
- 중복이 존재할 수 있어 이상(Anomaly) 현상이 발생할 수 있다는 것을 고려해야 한다.
3주차 느낀점
2주차때 배운게 많다고 느꼈지만 그게 아니였다...
3주차는 진짜 하루가 48시간이면 좋겠다고 느꼈다...
위에 정리해놓은 내용에 리눅스 기본 명령어부터 가상OS를 이용해서 db도 사용했고 전체적으로 리눅스를 사용하는 것을 배웠다
3주차 회고
2주차때 항상 완벽하게 이해하고 다음날 수업을 듣는게 조금 힘들었어서 매니저님께 상담을 요청했다. 매니저님께서 7~80%만 복습하고 나머지는 직접 해보면서 터득할 수 있다고 조언해주셔서 그렇게 복습하고 당일 배운 내용을 복습하던가 그것도 빨리 끝나면 프로그래머스 SQL 문제를 풀어봤다.
이번주는 프로젝트가 있느라 바빠서 복습도 문제풀이도 많이 못했지만 다음주에 끝나게 된다면 제대로 적용해서 해볼 생각이다!
좋았던 점
계속 복습하느라 풀어보고 싶었던 문제를 못풀기도 했고, SELECT 사용방법을 좀 까먹었다고 생각했는데 문제 풀면서 자연스레 생각나기도 하고 문제도 생각보다 잘 풀려서 그 점이 좋았다
아쉬웠던 점
리눅스 가상 OS를 쓰는게 너무 너무 어려웠다...
속도도 너무 느려서 너무 답답했다.
개선할 점
매주 느끼지만 컨디션 관리!!
다음주에 프로젝트가 끝나고 자바 들어갈텐데 열심히 준비하기!
다음주 목표
✅ 정규 수업시간 후 복습시간 갖기
✅ 프로그래머스 SQL고득점 키트 문제 하루에 한문제 이상 풀기
오 상담할 때 나눴던 내용으로 잘 하고 있었군요! 생각보다 완벽하게 복습을 진행하지 않아도 하다보면 생각나는 것들이 꽤 있죠? 복습이 계속 누적되다 보면 나중에는 그 부분을 더 실감할 수 있을 겁니다! 찬진님이 지금처럼 남아서 복습하고 열심히 공부하는 습관들이 계속 쌓이게 되었을 때 나중에 성장 속도 빨라지는 것을 느낄 수 있을거예요ㅎㅎ
자바 들어가기 전에 꼭 한 번 훑고 넘어가는 식이라도 예습 진행해보시고! 그 다음에 자바만 꽉 잡고 간다는 느낌으로 진행해보시면 좋을 것 같아요! 그리고 저희는 장기 레이스이니 꼭 컨디션 관리도 잘하시구요! 건강 안 좋아지면 놓치게 되는 게 너무 많습니다ㅠㅠ 지금도 시간이 없는 것 같지만 나중 가서 보면 지금이 제일 널널할 때입니다! 그러니 지금 시간을 잘 활용해보세요 ㅎㅎ
항상 응원해요 화이팅! 힘들거나 고민 있으면 얼마든지 상담 요청하시죠!