ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 온라인 쇼핑몰 관리 시스템
    DB 2024. 11. 1. 08:16

    연습용 테이블 설계 요구사항: 온라인 쇼핑몰 아이템 관리 시스템

    온라인 쇼핑몰 아이템 관리 시스템을 위해 데이터베이스를 설계하려고 합니다.

    해당 시스템은 다음 요구사항을 충족해야 합니다

     

    1. 회원(member): 각 회원은 회원ID, 이름, 이메일, 생성일시를 가지고 있습니다.

    2. 상품(product): 어떤 회원이 상품을 등록했는지에 대한 정보가 필요합니다. 상품ID, 상품명, 상품 상세설명, 상품 가격, 총 수량을 가지고 있습니다.

    3. 상품 이미지(product_image): 각 상품에 대한 이미지가 필요합니다. 상품 이미지ID, 상품ID, 메인 이미지, 서브 이미지1, 서브 이미지2, 서브 이미지3, 서브 이미지4로 구성되며 총 5개의 이미지가 필요합니다.

     

    초기 설계

     

    CREATE TABLE IF NOT EXISTS member (
        id BIGINT AUTO_INCREMENT,
        name VARCHAR(50) NOT NULL,
        email VARCHAR(255) NOT NULL,
        created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    )
    
    CREATE TABLE IF NOT EXISTS product (
        id BIGINT AUTO_INCREMENT,
        member_id BIGINT NOT NULL,
        name VARCHAR(255) NOT NULL,
        detail VARCHAR(500) NOT NULL,
        price INT NOT NULL,
        amount INT NOT NULL,
        FOREIGN KEY (member_id) REFERENCES member(id)
    )
    
    CREATE TABLE IF NOT EXISTS product_image (
        id BIGINT AUTO_INCREMENT,
        product_id BIGINT NOT NULL,
        member_id BIGINT NOT NULL,
        main_image VARCHAR(255) NOT NULL,
        sub_image_1 VARCHAR(255) NOT NULL,
        sub_image_2 VARCHAR(255) NOT NULL,
        sub_image_3 VARCHAR(255) NOT NULL,
        sub_image_4 VARCHAR(255) NOT NULL,
        FOREIGN KEY (product_id) REFERENCES product(id),
        FOREIGN KEY (member_id) REFERENCES member(id)
    )

     

     

    첫번째 개선사항

    product_image 테이블의 서브 이미지 칼럼들을 sub_image_1, sub_image_2, 등으로 각각 나누는 대신, 한 이미지당 하나의 레코드를 생성하는 방식이 더 유연합니다. 예를 들어, product_image 테이블에 image_url 칼럼과 image_order 칼럼을 추가하여 이미지 순서를 나타내도록 하면 됩니다. 이렇게 하면 이미지가 꼭 5개로 제한되지 않고, 필요에 따라 확장할 수 있습니다.

     

    CREATE TABLE IF NOT EXISTS product_image (
        id BIGINT AUTO_INCREMENT PRIMARy KEY,
        product_id BIGINT NOT NULL,
        image_url VARCHAR(255) NOT NULL,
        image_order INT NOT NULL
        FOREIGN KEY (product_id) REFERENCES product(id)
    )

     

     

    두번째 개선사항

     

    • 기본 키 설정:
      • 각 테이블의 기본 키(PRIMARY KEY)가 명시되지 않았습니다. 예를 들어, id 칼럼에 PRIMARY KEY 제약 조건을 추가하는 것이 좋습니다.
      • ERD 설계에는 PK라고 나타냈지만, 쿼리상에서는 명시적으로 나타나지 않았기 때문에 수정해야합니다.
    • product_image 테이블에서 image_order 필드:
      • image_order 필드가 있으면 한 제품에 대해 이미지 순서를 지정할 수 있어 유용합니다. 하지만 이 경우 image_order에 대한 값이 1부터 시작해 순차적으로 저장되도록 제약 조건을 두는 것도 고려해볼 수 있습니다. (예: CHECK 제약 조건)
    • 중복된 외래 키 (member_id):
      • product_image 테이블에서 member_id를 저장할 필요는 없습니다. 이미지 테이블은 제품 테이블에 종속되기 때문에, 제품을 등록한 회원 정보는 product 테이블에서 가져올 수 있습니다. 따라서 member_id 칼럼은 product_image 테이블에서 제거해도 됩니다.

     

    중복된 외래 키

    테이블 간의 연관관계를 다시 살펴보겠습니다.

     

    • 회원(Member)과 상품(Product) 간의 관계:
      • 상품은 특정 회원에 의해 등록된다는 점에서, 회원 엔티티가 상품 엔티티의 부모 역할을 합니다. 즉, 상품이 회원에게 종속되어 있으며, 회원이 삭제되면 해당 회원이 등록한 상품도 삭제될 가능성이 있습니다.
      • 식별 관계에서는 자식 엔티티(product)의 기본 키에 부모 엔티티(member)의 기본 키가 포함됩니다. 하지만 이 경우, product 테이블의 기본 키로 id를 단독으로 사용하더라도 논리적으로 식별 관계를 표현할 수 있습니다.
    • 상품(Product)과 상품 이미지(Product Image) 간의 관계:
      • 상품 이미지가 특정 상품에 종속되어 있지만, 식별 관계가 아니어야 합니다. product_image는 상품의 기본 키(product_id)를 외래 키로 참조하지만, 상품 이미지의 기본 키는 id로 독립적으로 설정됩니다.
      • 비식별 관계에서는 자식 엔티티의 기본 키가 부모 엔티티의 기본 키를 포함하지 않으며, 단지 외래 키로 참조만 할 뿐입니다. 이렇게 하면 상품 이미지를 product_id로 그룹화할 수 있지만, 각 이미지가 독립적인 기본 키를 가질 수 있습니다.
      • 즉, 종속되는건 맞지만 상품과 상품 이미지는 서로 독립적인 관계입니다.

     

    마치며..

    아직까지는 엔티티간 식별관계가 잘 떠오르지는 않는다. 조금 더 연습이 필요한 것 같다.

     

     

Designed by Tistory.