#Database_Design
"데이터베이스 디자인을 위한 단단한 기반 다지기"라는 제목으로 이 장에서는 데이터베이스 설계의 기본 개념과 원칙에 중점을 둔다.
잘 설계된 데이터베이스의 필요성
잘 설계된 데이터베이스
#Data_Model
다양한 어플리케이션 로직이 데이터베이스에 적용되기 위해 여러 데이터 모델이 존재한다.
현대 어플리케이션은 데이터베이스에 복잡한 로직을 넣지 않고 애플리케이션 계층에서 처리하기도 함.
이런 것은 software architect가 비즈니스 로직에 맞게 데이터 베이스 모델을 설계합니다.
아래는 대표적인 데이터 모델입니다:
#Relational_Model
현대 데이터베이스 시스템에서 근본이 Relational model이다.(우리가 자주 봤던 Exel이랑 유사함.)
관계형 모델은 테이블과 관계를 사용하여 데이터를 표현한다.
테이블은 행과 열로 구성이 된다:
#Primary_Key #Foreign_Key
관계형 모델의 핵심은 Primary key와 Foregin key라고 볼 수 있다.
Foreign Key는 대규모 시스템에서 운영상 복잡함을 유발할 수 있으므로 신중히 사용해야한다.
#Normalization
Normalization은 관계형 모델에서 매우 중요한 실천 양식이며, 데이터 중복을 줄이고, 불일치를 방지하기 위한 테이블 조직 방법이다.
복잡한 테이블을 더 작고 하나의 기증에 집중된 테이블로 분할하면서, 일정한 규칙, #Normal_Forms(정규형) 을 따르도록 한다.
이를 통해서 데이터의 integrity(무결성)을 유지히며, 중복되거나 충돌하는 정보로 인해 발생할 수 있는 문제를 방지한다.
extra) Normal Form은?
정규화된 결과, 1NF, 2NF, 3NF, BCNF, 4NF, 5NF가 있다.
실무적으로 4, 5NF는 잘 쓰이지 않는다고 한다.
데이터베이스 시스템에서 데이터 무결성은 조직의 데이터가 라이프사이클의 어느 시점에서든 정확하고 완전하며 일관성이 있다는 것을 보장하는 의미에서 매우 중요하다.
데이터베이스를 설계할 때 가장 초기 단계 중 하나는 Entity, Attribute, Relationship을 식별하는 것입니다.
이를 ERD(Entity Relationship Diagram)로 시각화한다.
데이터베이스에 정보를 저장하고자 하는 주요 객체 또는 개념입니다. 일반적으로 관계형 데이터베이스에서는 테이블로 정의된다.
예: School 데이터베이스에서 Student, Course, Teacher 등은 Entity가 될 수 있습니다.
Entity에 대한 개별적인 데이터 요소 또는 특성입니다. 테이블에서는 Column 또는 Field로 표현된다.
예: Student Entity의 속성은 StudentID, FirstName, LastName, DateOfBirth, Address 등이 될 수 있다.
서로 다른 Entity 간의 연관성 또는 연결 방식을 나타냅니다. 관계형 데이터베이스에서는 테이블 간의 연결을 정의합니다.
한 엔터티의 하나의 레코드가 다른 엔터티의 하나의 레코드와만 연결됩니다.
예: Person <-> SocialSecurityNumber (사람은 주민등록번호 하나만 가짐)
한 엔터티의 하나의 레코드가 다른 엔터티의 여러 레코드와 연결됩니다.
예: 한 명의 Teacher가 여러 개의 Course를 가르칠 수 있음. 그러나 각 Course는 한 명의 Teacher에게만 속함.
양쪽 엔터티의 여러 레코드들이 서로 연결됩니다. 일반적으로 조인 테이블(중간 테이블)을 통해 구현됩니다.
예: Student와 Course는 다대다 관계. 학생은 여러 과목에 등록할 수 있고, 과목도 여러 학생이 수강할 수 있음. StudentCourses라는 조인 테이블 생성. 여기에는 StudentID, CourseID와 같은 속성이 포함됨.
Entity와 그 관계를 정의하는 것은 데이터베이스 모델을 설계하기 전, 애플리케이션의 요구사항 분석 단계에서 매우 중요합니다.
다음은 ER 설계의 기반이 되는 주요 단계들 입니다:
Student, Course가 Entity 후보.Student의 속성은 이름, 생년월일, 주소 등.데이터베이스 설계는 비즈니스의 운영 요구사항에 따라 다양하게 달라질 수 있다.
그리고 항상 단순한 설계와 복잡하지만 문제를 효율적으로 해결할 수 있는 설계 사이에는 트레이드오프가 존재합니다.
"고급 데이터베이스 설계"에 도달하기 위해 설계자는 단순한 해결책보다는 애플리케이션이 더 효율적으로 작동할 수 있도록 설계하는 것을 선택할 수 있다.
-->
쉬운 길을 택하기보다는, 현실적인 과제를 해결하기 위한 효율적이고 견고한 데이터베이스 설계에 집중할 것입니다.
정규화의 목적은, 각 테이블의 열에서 중복을 줄여 데이터를 정리하는 것입니다.
정규화는 다음의 장점을 가진다:
데이터베이스 설계가 완료되면, 시간이 지나면서 비즈니스 요구, 버그 수정, 기능 개선, 규제 요건 반영 등으로 인해 데이터베이스 설계를 수정해야 할 일이 생깁니다. 이는 데이터베이스 운영에 있어 비용이 많이 들고 위험도 높은 작업이 될 수 있습니다.
| 정규형 | 핵심 개념 |
|---|---|
| 1NF | 컬럼 값은 더 이상 나눌 수 없는 원자값 |
| 2NF | 부분 종속 제거 (복합키의 일부에만 의존한 컬럼 제거) |
| 3NF | 이행적 종속 제거 (A → B → C 형태 제거) |
| 항목 | 목적 | 예시 |
|---|---|---|
| Private Key | 고유성, NULL 방지 | StudentID, CourseID |
| Foreign Key | 참조 무결성 | StudentCourses의 StudentID |
| AUTO_INCREMENT | 자동 고유 번호 생성 | PK 자동 증가 |
| Atomicity | 1NF 준수 | 리스트 형태 저장 금지 |
| 데이터 타입 정의 | 타입 일관성 | VARCHAR, DATE 등 |
| Normalization | 이상 현상 방지 | 2NF 이상 구조 |
| 열 제약조건 | 유효성 검사 | CHECK, DEFAULT, NOT NULL, UNIQUE 등 |
mysql> drop table student; ERROR 3730 (HY000): Cannot drop table 'student' referenced by a foreign key constraint 'studentcourses_ibfk_1' on table 'StudentCourses'.
mysql> delete from course; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`designandmodeling`.`studentcourses`, CONSTRAINT `studentcourses_ibfk_2` FOREIGN KEY (`CourseID`) REFERENCES `course` (`CourseID`))