데이터베이스 설계 1:1 0 6 708

by r-1y [MySQL] 설계 데이터베이스 디비 mysql MySQL [2021.08.12 12:26:27]


안녕하세요, 데이터베이스 설계시 표준적으로는 1:1 관계를 피하라고 알고 있는데 만약 아래와 같은 상황에는 1:1 관계가 더 좋을까요??

ex )  상황은 이렇습니다 배송지가 있는데 특정 배송지만 배송 시간, 배송 불가능 시간이 정해져 있습니다. 현재는 배송지 테이블에 필드로 구분하여 사용하고 있지만 배송 시간, 배송 불가능 시간을 대체적으로 사용하는 배송지가 몇개 없어서 따로 배송지 디테일이라는 테이블에 배송 시간, 배송 불가능 시간 필드를 가진 테이블을 만들어서 1:1 맵핑을 하려고 합니다 이런 상황에는 1:1 관계가 더 좋을까요??

기존 테이블

CREATE TABLE address
(
    `id`                       INT            NOT NULL    AUTO_INCREMENT, 
    `recipient`                VARCHAR(45)   NOT NULL, 
    `phone_number`             VARCHAR(12)   NOT NULL, 
    `address1`                 VARCHAR(500)   NOT NULL, 
    `address2`                 VARCHAR(500)   NOT NULL, 
    `zip_code`                 VARCHAR(15)   NOT NULL, 
    `delivery_start_time`      TIME    NULL, 
    `delivery_end_time`        TIME    NULL, 
    `not_delivery_start_time`  TIME    NULL, 
    `not_delivery_end_time`    TIME    NULL,
);

샘플 데이터

address
1, 손오공, 010-0000-0000, 서울 어딘가, 2호 , 21255, NULL, NULL, NULL, NULL
2, 손오반, 010-0000-0000, 부산 어딘가, 205호 , 11111, 15:00, 17:00, 13:00, 14:00
3, 손오구, 010-0000-0000, 울산 어딘가, 지하 101호 , 52321, NULL, NULL, NULL, NULL
4, 손오걍, 010-0000-0000, 대구 어딘가, 506호 , 25167, NULL, NULL, NULL, NULL

CREATE TABLE address
(
    `id`                       INT            NOT NULL    AUTO_INCREMENT, 
    `recipient`                VARCHAR(45)   NOT NULL, 
    `phone_number`             VARCHAR(12)   NOT NULL, 
    `address1`                 VARCHAR(500)   NOT NULL, 
    `address2`                 VARCHAR(500)   NOT NULL, 
    `zip_code`                 VARCHAR(15)   NOT NULL, 
);


CREATE TABLE address-detail
(
    `id`                       INT     NOT NULL    AUTO_INCREMENT, 
    `delivery_start_time`      TIME    NOT NULL, 
    `delivery_end_time`        TIME    NOT NULL, 
    `not_delivery_start_time`  TIME    NOT NULL, 
    `not_delivery_end_time`    TIME    NOT NULL, 
    `address_id`               INT     NOT NULL, 
);
샘플 데이터

address
1, 손오공, 010-0000-0000, 서울 어딘가, 2호 , 21255
2, 손오반, 010-0000-0000, 부산 어딘가, 205호 , 11111
3, 손오구, 010-0000-0000, 울산 어딘가, 지하 101호 , 52321
4, 손오걍, 010-0000-0000, 대구 어딘가, 506호 , 25167

address-detail
1, 15:00, 17:00, 13:00, 14:00, 1

 

by 마농 [2021.08.12 13:26:47]

관리적 측면, 성능적 측면을 고려하여 엔티티를 분할하기도 합니다.
다만, 위 예시는 1:1 보다는 1:다 느낌이 드네요.
가능 시간이나, 불가능 시간이 한번만 있으리란 법은 없을 듯 하네요.


by r-1y [2021.08.12 16:54:36]

정책상 1:1으로만 사용할 예정입니다!


by 우리집아찌 [2021.08.12 15:22:08]

배송 불가능 시간을 잘 안쓰신다면 정규화 시키셔야죠

id / sub_id /구분 / 배송 시작 / 배송 종료

1/ 1 /가능 / 11:30 / 14:00

1/2/ 불가 / 14:00 / 15:00

2/1/가능/ ....

3/1/가능/ ...

 


by r-1y [2021.08.12 16:55:16]

제가 잘 이해를 못했는데 1:1 관계에서 addresss 1:n address_detail으로 만든 다음에 우리집아찌님 처럼 필드를 만들라는 소리이신가요?!


by 우리집아찌 [2021.08.13 11:20:06]

 

 네 1/n 구조로 가시면 불가능 내역은 불필요할경유 저장이 안되니 스토리지를 절약할수도 있고 다른 구분값을로 차후에 비슷한 정보를 저장할수도 있습니다.

경우에 따라 시간 필드를 하나만 쓰고 구분값으로 시작/종료도 나눌수도 있습니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입