>데이터 베이스 >MySQL 튜토리얼 >정규화된 데이터베이스 설계는 어떻게 EAV(엔티티-속성-값) 모델의 대안으로 제품 변형을 효과적으로 모델링할 수 있습니까?

정규화된 데이터베이스 설계는 어떻게 EAV(엔티티-속성-값) 모델의 대안으로 제품 변형을 효과적으로 모델링할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-06 07:01:12413검색

How can a normalized database design effectively model product variants as an alternative to the Entity-Attribute-Value (EAV) model?

제품 변형 모델링

제품 변형을 모델링하려고 하는데 EAV(엔티티 속성 값) 사용에 대해 몇 가지 우려가 있었습니다. 고려할 수 있는 대체 디자인은 다음과 같습니다.

정규화된 디자인

다음 디자인은 제품 변형에 대한 데이터 구조를 정규화합니다.

+---------------+     +-----------------+
| PRODUCTS      |-----< PRODUCT_VARIANTS  |
+---------------+     +-----------------+
| #product_id   |     | #product_id       |
|  product_name |     | #variant_id       |
+---------------+     |  sku_id           |
         |             +-----------------+
         |                       |
+--------^--------+     +--------^--------+
| PRODUCT_OPTIONS |-----< VARIANT_VALUES  |
+-----------------+     +-----------------+
| #product_id     |     | #product_id     |
| #option_id      |     | #variant_id     |
+--------v--------+     | #option_id      |
         |              |  value_id       |
+-----------------+     +--------v--------+
| OPTIONS         |              |
+-----------------+              |
| #option_id      |              |
|  option_name    |              |
+-----------------+              |
         |                       |
 +-------^-------+               |
 | OPTION_VALUES |---------------+
 +---------------+
 | #option_id    |
 | #value_id     |
 |  value_name   |
 +---------------+

기본, 고유 및 외국 키:

PRODUCTS
- PK: product_id
- UK: product_name

OPTIONS
- PK: option_id
- UK: option_name

OPTION_VALUES
- PK: option_id, value_id
- UK: option_id, value_name
- FK: option_id REFERENCES OPTIONS (option_id)

PRODUCT_OPTIONS
- PK: product_id, option_id
- FK: product_id REFERENCES PRODUCTS (product_id)
- FK: option_id REFERENCES OPTIONS (option_id)

PRODUCT_VARIANTS
- PK: product_id, variant_id
- UK: sku_id
- FK: product_id REFERENCES PRODUCTS (product_id)

VARIANT_VALUES
- PK: product_id, variant_id, option_id
- FK: product_id, variant_id REFERENCES PRODUCT_VARIANTS (product_id, variant_id)
- FK: product_id, option_id REFERENCES PRODUCT_OPTIONS (product_id, option_id)
- FK: option_id, value_id REFERENCES OPTION_VALUES (option_id, value_Id)

작동 방식

  • PRODUCTS에는 이름과 같은 기본 제품 정보가 포함되어 있습니다.
  • OPTIONS에는 크기 또는 크기와 같은 사용 가능한 옵션이 나열됩니다. 색상.
  • OPTION_VALUES는 Small 또는 Red와 같은 옵션의 특정 값을 보유합니다.
  • PRODUCT_OPTIONS는 제품과 연결된 옵션을 매핑합니다.
  • PRODUCT_VARIANTS는 실제 제품 변형을 저장합니다.
  • VARIANT_VALUES는 옵션 값에 변형을 연결합니다.

이 디자인을 사용하면 옵션과 해당 값을 독립적으로 정의할 수 있어 유연성이 향상됩니다. 미래에 새로운 옵션이나 가치를 추가하기 위해.

샘플 데이터

다음은 질문의 스프레드시트를 기반으로 이러한 테이블에 데이터를 입력할 수 있는 방법의 예입니다.

PRODUCTS
========
product_id product_name
---------- ------------
1          Widget 1
2          Widget 2
3          Widget 3

OPTIONS
=======
option_id option_name
--------- -----------
1         Size SL
2         Color
3         Size SM
4         Class
5         Size ML

OPTION_VALUES
=============
option_id value_id value_name
--------- -------- ------------
1         1        Small        (Size SL)
1         2        Large        (Size SL)
2         1        White        (Color)
2         2        Black        (Color)
3         1        Small        (Size SM)
3         2        Medium       (Size SM)
4         1        Amateur      (Class)
4         2        Professional (Class)
5         1        Medium       (Size ML)
5         2        Large        (Size ML)

PRODUCT_OPTIONS
===============
product_id option_id
---------- ---------
1          1         (Widget 1; Size SL)
1          2         (Widget 1; Color)
2          3         (Widget 2; Size SM)
3          4         (Widget 3; Class)
3          5         (Widget 4; Size ML)

PRODUCT_VARIANTS
================
product_id variant_id sku_id
---------- ---------- ------
1          1          W1SSCW (Widget 1)
1          2          W1SSCB (Widget 1)
1          3          W1SLCW (Widget 1)
1          4          W1SLCB (Widget 1)
2          1          W2SS   (Widget 2)
2          2          W2SM   (Widget 2)
3          1          W3CASM (Widget 3)
3          2          W3CASL (Widget 3)
3          3          W3CPSM (Widget 3)
3          4          W3CPSL (Widget 3)

VARIANT_VALUES
==============
product_id variant_id option_id value_id
---------- ---------- --------- --------
1          1          1         1        (W1SSCW; Size SL; Small)
1          1          2         1        (W1SSCW; Color; White)
1          2          1         1        (W1SSCB; Size SL; Small)
1          2          2         2        (W1SSCB; Color; Black)
1          3          1         2        (W1SLCW; Size SL; Large)
1          3          2         1        (W1SLCW; Color; White)
1          4          1         2        (W1SLCB; Size SL; Large)
1          4          2         2        (W1SLCB; Color; Black)
2          1          3         1        (W2SS; Size SM; Small)
2          2          3         2        (W2SM; Size SM; Medium)
3          1          4         1        (W3CASM; Class; Amateur)
3          1          5         1        (W3CASM; Size ML; Medium)
3          2          4         1        (W3CASL; Class; Amateur)
3          2          5         2        (W3CASL; Size ML; Large)
3          3          4         2        (W3CPSM; Class; Professional)
3          3          5         1        (W3CPSM; Size ML; Medium)
3          4          4         2        (W3CPSL; Class; Professional)
3          4          5         2        (W3CPSL; Size ML; Large)

장점

  • 더 큰 유연성과 확장성.
  • 복잡한 조인을 피하여 쿼리를 단순화합니다.
  • 외래 키를 통해 데이터 무결성을 강화합니다.

단점

  • 에 비해 더 많은 테이블이 필요합니다. EAV.
  • 더 복잡한 데이터베이스 설계 및 유지 관리가 필요할 수 있습니다.

결론

이 정규화된 설계는 모델링을 위한 EAV의 실행 가능한 대안입니다. 제품 변형. 유연성, 확장성 및 데이터 무결성을 제공하는 동시에 쿼리도 상대적으로 쉽습니다. 그러나 EAV와 정규화 간의 구체적인 선택은 애플리케이션의 특정 요구 사항과 장단점을 기반으로 이루어져야 합니다.

위 내용은 정규화된 데이터베이스 설계는 어떻게 EAV(엔티티-속성-값) 모델의 대안으로 제품 변형을 효과적으로 모델링할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.