Building a Strong Foundation for Database Design

Choo121600·2025년 4월 8일
0

#Database_Design

"데이터베이스 디자인을 위한 단단한 기반 다지기"라는 제목으로 이 장에서는 데이터베이스 설계의 기본 개념과 원칙에 중점을 둔다.

  • 데이터베이스를 만들기 전에 견고한 기반이 왜 중요한지
  • 데이터베이스를 설계할 때 필요한 단계
    • Data, Database, DBMS의 용어 정의

The importance of a solid foundation in database design

잘 설계된 데이터베이스의 필요성

  • 효율적으로 데이터를 저장하고 검색 가능

잘 설계된 데이터베이스

  • 데이터의 정확성과 일관성 유지
    - primary key, unique key 와 같은 데이터 무결성 제약 조건 포함
    - 데이터의 anomalies(이상)을 방지하고 저장된 정보의 신뢰성을 확보하는데 중요한 역할을 함.
  • 향후 애플리케이션의 성장과 변화 수용 가능성(확장성과 유연성)
  • 유지 관리 및 업데이트에 용이
    - 데이터 모델 혹은 스키마 변경이 필요할 때, 기존 기능에 영향을 주거나 손상을 일으키지 않고 효율적으로 수정할 수 있어야함.
  • 민감함 데이터를 보호하고 무단 접근을 방지하기 위한 보안 및 규정 준수도 필요함.

Key terms and data models

핵심 용어

  • #Entity: 데이터베이스에서 표현되는 독립적인 객체나 개념입니다. 사람, 장소, 사물, 사건 등이 될 수 있습니다.
  • #Attribute: Entity의 특징이나 속성입니다. Entity에 대해 저장될 수 있는 구체적인 정보를 정의합니다.
  • #Relationship: 둘 이상의 Entity 간의 연관이나 연결입니다. Entity들이 서로 어떻게 관련되어 있는지를 나타냅니다.
  • #Primary_Key: 테이블 내의 각 레코드를 고유하게 식별하는 키입니다. 각 행을 유일하게 구분할 수 있도록 보장합니다.
  • #Foreign_Key: 다른 테이블의 Primary Key를 참조하는 필드입니다. 두 테이블 간의 연결을 만들고, 참조 무결성을 유지합니다.
  • #Index: 특정 데이터를 더 빠르게 검색할 수 있도록 도와주는 자료 구조입니다. 검색 속도를 향상시키는 데 사용됩니다.
  • #Normalization: 데이터 중복을 줄이고 무결성을 높이기 위해 데이터를 체계적으로 조직하는 과정입니다.

Data Models

#Data_Model

다양한 어플리케이션 로직이 데이터베이스에 적용되기 위해 여러 데이터 모델이 존재한다.
현대 어플리케이션은 데이터베이스에 복잡한 로직을 넣지 않고 애플리케이션 계층에서 처리하기도 함.
이런 것은 software architect가 비즈니스 로직에 맞게 데이터 베이스 모델을 설계합니다.

아래는 대표적인 데이터 모델입니다:

  • #Hierarchical_model(계층형 모델): 데이터를 트리 형태로 구성하며, 부모-자식 관계로 연결됩니다. 하나의 부모는 여러 자식을 가질 수 있지만, 각 자식은 하나의 부모만 가질 수 있습니다.
  • #Network_model(네트워크 모델): 데이터를 node와 arc로 표현하며, 레코드 간에 다대다 관계를 허용합니다. 복잡한 관계를 표현할 수 있습니다.
  • #Relational_model(관계형 모델): 가장 널리 사용되는 데이터 모델로, 데이터를 행과 열로 구성된 테이블 형태로 표현합니다. 테이블간 관계를 key를 통해 연결하여 관계를 정의합니다.
  • #ER_model(Entity-Relationship 모델): Entity, Attribute, Relationship을 그래프 형태로 표현한 데이터베이스 구조 모델입니다. 관계형 데이터베이스를 설계하는 데 자주 사용됩니다.
  • #Object-oriented_data_model(객체지향 모델): 객체 지향 패러다임의 개념을 데이터베이스에 적용한 모델입니다. 데이터를 속성과 메서드를 가진 객체로 표현합니다. Java, C++, Python 등의 객체지향 언어에서 사용되는 객체 개념을 데이터베이스에 확장하여 적용합니다.
  • #Object-relational_data_model(객체-관계형 모델): 관계형 모델에 객체지향 기능을 결합한 하이브리드 모델입니다. 복잡한 데이터 타입과 관계를 처리할 수 있습니다.

Understanding the Relational model in detail

#Relational_Model

현대 데이터베이스 시스템에서 근본이 Relational model이다.(우리가 자주 봤던 Exel이랑 유사함.)

관계형 모델은 테이블과 관계를 사용하여 데이터를 표현한다.
테이블은 행과 열로 구성이 된다:

  • 행: 각 행은 하나의 개별 인스턴스 또는 레코드를 나태내고 고유한 속성 집합을 포함한다.
  • 열: 각 열은 Entity를 설명하는 구체적인 데이터 포인트를 나타낸다.

관계형 모델의 핵심 Key

#Primary_Key #Foreign_Key

관계형 모델의 핵심은 Primary key와 Foregin key라고 볼 수 있다.

  • Primary key: 테이블 내의 각 행을 고유하게 식별하며 데이터의 유일성과 무결성을 보장
  • Foreign key: 다른 테이블의 Primary Key를 참조하여 두 테이블 간의 관계를 형성할 때 사용.

Foreign Key는 대규모 시스템에서 운영상 복잡함을 유발할 수 있으므로 신중히 사용해야한다.

https://code.openark.org/blog/mysql/the-problem-with-mysql-foreign-key-constraints-in-online-schema-changes

Normalization 의 중요성

#Normalization

Normalization은 관계형 모델에서 매우 중요한 실천 양식이며, 데이터 중복을 줄이고, 불일치를 방지하기 위한 테이블 조직 방법이다.

복잡한 테이블을 더 작고 하나의 기증에 집중된 테이블로 분할하면서, 일정한 규칙, #Normal_Forms(정규형) 을 따르도록 한다.

이를 통해서 데이터의 integrity(무결성)을 유지히며, 중복되거나 충돌하는 정보로 인해 발생할 수 있는 문제를 방지한다.

extra) Normal Form은?
정규화된 결과, 1NF, 2NF, 3NF, BCNF, 4NF, 5NF가 있다.
실무적으로 4, 5NF는 잘 쓰이지 않는다고 한다.

Data integrity(데이터 무결성)

데이터베이스 시스템에서 데이터 무결성은 조직의 데이터가 라이프사이클의 어느 시점에서든 정확하고 완전하며 일관성이 있다는 것을 보장하는 의미에서 매우 중요하다.

데이터 무결성이 중요한 이유

관계형 모델의 장점

  • 단순함: 사용자 친화적인 구조로, 초보자부터 전문가까지 쉽게 접근 가능
  • 유연성: 다양한 쿼리 및 리포팅 기능을 통해 방대한 데이터에서도 필요한 정보를 쉽게 추출 가능
  • 무결성: 데이터 정확성과 일관성을 자연스럽게 보장
  • 정규화의 이점: 데이터 관리의 효율성과 안정성 향상

Identifying entities, attributes, and relationships in database design

데이터베이스를 설계할 때 가장 초기 단계 중 하나는 Entity, Attribute, Relationship을 식별하는 것입니다.
이를 ERD(Entity Relationship Diagram)로 시각화한다.

Entity

데이터베이스에 정보를 저장하고자 하는 주요 객체 또는 개념입니다. 일반적으로 관계형 데이터베이스에서는 테이블로 정의된다.
예: School 데이터베이스에서 Student, Course, Teacher 등은 Entity가 될 수 있습니다.

Attribute

Entity에 대한 개별적인 데이터 요소 또는 특성입니다. 테이블에서는 Column 또는 Field로 표현된다.
예: Student Entity의 속성은 StudentID, FirstName, LastName, DateOfBirth, Address 등이 될 수 있다.

Relationship

서로 다른 Entity 간의 연관성 또는 연결 방식을 나타냅니다. 관계형 데이터베이스에서는 테이블 간의 연결을 정의합니다.

관계의 유형

1:1

한 엔터티의 하나의 레코드가 다른 엔터티의 하나의 레코드와만 연결됩니다.
예: Person <-> SocialSecurityNumber (사람은 주민등록번호 하나만 가짐)

1:N

한 엔터티의 하나의 레코드가 다른 엔터티의 여러 레코드와 연결됩니다.
예: 한 명의 Teacher가 여러 개의 Course를 가르칠 수 있음. 그러나 각 Course는 한 명의 Teacher에게만 속함.

M:N

양쪽 엔터티의 여러 레코드들이 서로 연결됩니다. 일반적으로 조인 테이블(중간 테이블)을 통해 구현됩니다.
예: StudentCourse는 다대다 관계. 학생은 여러 과목에 등록할 수 있고, 과목도 여러 학생이 수강할 수 있음. StudentCourses라는 조인 테이블 생성. 여기에는 StudentID, CourseID와 같은 속성이 포함됨.

ERD를 위한 단계

Entity와 그 관계를 정의하는 것은 데이터베이스 모델을 설계하기 전, 애플리케이션의 요구사항 분석 단계에서 매우 중요합니다.
다음은 ER 설계의 기반이 되는 주요 단계들 입니다:

  1. 요구사항 수집
    • 이해관계자와 만나 시스템의 범위와 요구사항을 파악합니다.
  2. Entity 식별
    • 요구사항 문서에서 명사(Noun)를 찾아봅니다.
      예: “학생들은 수업에 등록해야 한다” → Student, Course가 Entity 후보.
  3. 속성 식별
    • 각 엔터티에 대해 어떤 정보가 필요한지 질문합니다.
      예: Student의 속성은 이름, 생년월일, 주소 등.
  4. 관계 식별
    • 엔터티 간의 연결 방식을 정의합니다.
      예: “한 학생이 여러 수업에 등록할 수 있는가?”, “한 교사가 여러 학생을 가르치는가?” 등.
  5. 초기 ERD 작성
    • 위에서 파악한 내용을 바탕으로 ER 다이어그램을 그려봅니다.
      → 엔터티, 속성, 관계를 시각적으로 표현.
  6. 검토 및 개선
    • 이해관계자와 함께 ERD를 검토하고, 필요 시 수정을 반영합니다.
  7. 정규화(Normalization)
    • 테이블 구조를 체계적으로 분해하여 데이터 중복을 최소화하고, 삽입, 수정, 삭제 이상현상(Anomaly)을 방지합니다.

Advanced database design

데이터베이스 설계는 비즈니스의 운영 요구사항에 따라 다양하게 달라질 수 있다.
그리고 항상 단순한 설계와 복잡하지만 문제를 효율적으로 해결할 수 있는 설계 사이에는 트레이드오프가 존재합니다.

"고급 데이터베이스 설계"에 도달하기 위해 설계자는 단순한 해결책보다는 애플리케이션이 더 효율적으로 작동할 수 있도록 설계하는 것을 선택할 수 있다.

-->
쉬운 길을 택하기보다는, 현실적인 과제를 해결하기 위한 효율적이고 견고한 데이터베이스 설계에 집중할 것입니다.

Normalization – reducing redundancy and improving data integrity (중복 제거 및 데이터 무결성 향상)

정규화의 목적은, 각 테이블의 열에서 중복을 줄여 데이터를 정리하는 것입니다.

정규화는 다음의 장점을 가진다:

  • 저장공간 절약
  • 처리 성능 향상
  • 입출력 작업의 효율화
  • 유연하고 견고한 스키마 구현
  • 개발자가 비즈니스 로직을 더 효율적으로 적용할 수 있는 깔끔한 데이터베이스 설계

데이터베이스 설계가 완료되면, 시간이 지나면서 비즈니스 요구, 버그 수정, 기능 개선, 규제 요건 반영 등으로 인해 데이터베이스 설계를 수정해야 할 일이 생깁니다. 이는 데이터베이스 운영에 있어 비용이 많이 들고 위험도 높은 작업이 될 수 있습니다.

Achieving normal forms – 1NF, 2NF, and 3NF

정규형핵심 개념
1NF컬럼 값은 더 이상 나눌 수 없는 원자값
2NF부분 종속 제거 (복합키의 일부에만 의존한 컬럼 제거)
3NF이행적 종속 제거 (A → B → C 형태 제거)

Ensuring database validity and integrity

데이터베이스의 유효성과 무결성 보장

항목목적예시
Private Key고유성, NULL 방지StudentID, CourseID
Foreign Key참조 무결성StudentCourses의 StudentID
AUTO_INCREMENT자동 고유 번호 생성PK 자동 증가
Atomicity1NF 준수리스트 형태 저장 금지
데이터 타입 정의타입 일관성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`))
profile
추영욱입니다.

0개의 댓글