Lsiron

데이터 모델링이란? 본문

데이터베이스/MySQL

데이터 모델링이란?

Lsiron 2024. 7. 9. 01:35

데이터 모델링?

데이터 모델링은 데이터베이스 시스템을 설계하고 구축하기 위한 과정이다. 이 과정에서는 데이터가 어떻게 저장되고, 접근되고, 관리되는지에 대한 구조와 관계를 정의한다.

 

즉, 현실 세계에 존재하는 데이터를 데이터베이스화 하는 과정이다.

 

예를 들어 공유 킥보드를 이용하기 위해서는 회원가입을 하고 앱을 설치해야 한다. 하지만 공유 킥보드 브랜드가 여러개 생기면서, 회원가입을 해야 할 브랜드가 많아지고 관리가 어려워졌다.

 

그래서 모든 공유 킥보드를 모아서 관리하는 서비스를 만들기로 했다. 

 

첫 번째 과정으로 데이터베이스를 설계하려고 한다.

 

데이터 모델과 구성 요소

데이터 모델이란, 현실 세계의 데이터를 단순화, 추상화하여 표현한 모델이라는 뜻.

 

- 개체(Entity): 데이터로 표현하고자 하는 현실 세계의 개념이나 정보의 단위 (ex. 킥보드, 회원)

 => 명사를 떠올릴 것. 개체의 데이터를 인스턴스 라고 한다. (ex. 킥보드 인스턴스)

- 속성(Attribute): 개체에 대한 정보 (ex. 킥보드의 브랜드 / 이용 가격, 회원의 아이디/이름)

- 관계(Relationship): 개체 간의 연관성 (ex. 고객은 킥보드를 대여한다.)

 => 동사를 떠올릴 것.

 

과정

데이터 모델링을 진행하는 과정은 다음과 같다.

 

1. 개념적 설계: 현실 세계를 추상적 개념으로 표현하는 과정

 => DBMS와 독립적으로 시행하여, 그림으로 나타낸다.

2. 논리적 설계: DBMS가 처리할 수 있는 데이터구조(스키마)를 설계

 => 개념적 설계를 통해 도식화한 결과를 본인이 사용할 DBMS에 맞게 데이터 구조를 설계 하는것.

3. 물리적 설계: DBMS에 테이블을 저장할 구조를 설계

 => 도출된 스키마를 가지고 물리적 설계를 한다. 즉, 컴퓨터에 데이터베이스를 만들고 얻는 과정이다.

 

ER 다이어그램

ER 다이어그램은 데이터베이스 설계에서 개체(Entity), 속성(Attribute), 그리고 이들 간의 관계(Relationship)를 시각적으로 표현한 다이어그램이다. 이는 개념적 데이터 모델링 단계에서 사용된다.

 

왜 사용해야 하는가?

  1. 시각적 이해: 데이터베이스 구조를 시각적으로 표현하여 설계자, 개발자, 비즈니스 이해관계자 등이 쉽게 이해할 수 있다.
  2. 명확한 요구사항 정의: 비즈니스 요구사항을 데이터베이스 설계로 변환하는 과정에서 명확한 요구사항을 정의할 수 있다.
  3. 효율적인 설계: 데이터베이스 설계를 체계적이고 효율적으로 수행할 수 있도록 도와준다.
  4. 의사소통: 데이터베이스 구조에 대한 팀 내 의사소통을 원활하게 한다.

어디에 사용하는가?

  • 데이터베이스 설계: 데이터베이스 시스템을 설계할 때, 개체와 관계를 정의하는 데 사용된다.
  • 비즈니스 프로세스 모델링: 비즈니스 프로세스를 데이터 모델로 변환할 때 사용된다.
  • 시스템 분석 및 설계: 시스템의 데이터를 구조화하고 분석할 때 사용된다.

어떻게 사용하는가?

  1. 개체 (Entity) 정의
    • 데이터베이스에서 관리할 주요 객체를 정의한다.
    • 예: 고객(Customer), 주문(Order), 제품(Product).
  2. 속성 (Attribute) 정의
    • 각 개체의 특성을 정의한다.
    • 예: 고객의 이름, 이메일, 주문 날짜, 제품 가격.
  3. 관계 (Relationship) 정의
    • 개체 간의 관계를 정의한다.
    • 예: 고객은 여러 주문을 할 수 있고, 각 주문은 여러 제품을 포함할 수 있습니다.
  4. ER 다이어그램 작성
    • 개체, 속성, 관계를 시각적으로 표현하여 다이어그램을 작성한다.

예시를 통한 설명

1. 개체 및 속성 정의

  • 고객 (Customer)
    • 고객 ID (customer_id)
    • 이름 (name)
    • 이메일 (email)
  • 주문 (Order)
    • 주문 ID (order_id)
    • 주문 날짜 (order_date)
    • 고객 ID (customer_id)
  • 제품 (Product)
    • 제품 ID (product_id)
    • 이름 (name)
    • 가격 (price)

2. 관계 정의( 하나의 데이터가 몇 개의 데이터와 관계를 가지는지 나타냄 )

  • 고객과 주문: 한 고객은 여러 주문을 할 수 있다 (일대다 관계 - 1:N 관계 => 1     N ). 
  • 주문과 제품: 한 주문은 여러 제품을 포함할 수 있다 (다대다 관계 - N:M 관계 => N     M ) = 테이블로 표기하며 각 개체의 기본키를 외래키로 가짐.
  • 번외로 일대일 관계가 있다.( 1:1 관계 => 1     1 )
+--------------+          +------------+          +--------------+
|   Customer   |          |   Order    |          |   Product    |
+--------------+          +------------+          +--------------+
| customer_id  |<-------->| customer_id|          | product_id   |
| name         |1       M | order_id   |<---+     | name         |
| email        |          | order_date |    |     | price        |
+--------------+          +------------+    |     +--------------+
                                            |
                                            |     +--------------+
                                            +---->| OrderProduct |
                                                  +--------------+
                                                  | order_id     |
                                                  | product_id   |
                                                  | quantity     |
                                                  +--------------+

 

 

  • Customer와 Order: 일대다 관계. 하나의 고객이 여러 주문을 할 수 있다.
  • Order와 Product: 다대다 관계. 하나의 주문에 여러 제품이 포함될 수 있다. 이를 위해 중간 테이블(OrderProduct)이 필요하다.

 

 

다음은 MySQL에서 위의 ER 다이어그램을 구현하는 SQL 스크립트 예시이다.

CREATE TABLE Customer (
    customer_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL
);

CREATE TABLE `Order` (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE NOT NULL,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)
);

CREATE TABLE Product (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) NOT NULL
);

CREATE TABLE OrderProduct (
    order_id INT,
    product_id INT,
    quantity INT NOT NULL,
    PRIMARY KEY (order_id, product_id),
    FOREIGN KEY (order_id) REFERENCES `Order`(order_id),
    FOREIGN KEY (product_id) REFERENCES Product(product_id)
);