ホームページ > データベース > mysql チュートリアル > 私の EAV ベースの製品バリアント データベース設計は適切で、スケーラブルで、正規化されていますか? それとも、代替のリレーショナル設計の方がクエリとパフォーマンスが優れていますか?

私の EAV ベースの製品バリアント データベース設計は適切で、スケーラブルで、正規化されていますか? それとも、代替のリレーショナル設計の方がクエリとパフォーマンスが優れていますか?

Patricia Arquette
リリース: 2024-11-29 14:01:11
オリジナル
920 人が閲覧しました

Is my EAV-based product variant database design sound, scalable, and normalized, or does the alternative relational design offer better querying and performance?

製品バリアントのモデリング

問題

あなたは製品バリアントをモデル化しようとしていますが、EAV (エンティティ属性値) が必要である可能性があると考えています。あなたのデザインは次のとおりです:

PRODUCT      -> 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   |
 +---------------+
ログイン後にコピー

デザインが適切かどうか、クエリやスケーラビリティの問題があるかどうか、正規化されているかどうかを知りたいと考えています。

設計上の考慮事項

製品バリエーションをモデリングする目的は、サイズ、色、素材など、さまざまなバリエーションを持つ可能性のある製品を表すことです。通常、各バリエーションは固有の SKU (在庫管理単位) に関連付けられています。

EAV を使用しない代替設計は次のとおりです。

+---------------+     +---------------+
| PRODUCTS      |-----< PRODUCT_SKUS  |
+---------------+     +---------------+
| #product_id   |     | #product_id   |
|  product_name |     | #sku_id       |
+---------------+     |  sku          |
        |             |  price        |
        |             +---------------+
        |                     |
+-------^-------+      +------^------+
| OPTIONS       |------< SKU_VALUES  |
+---------------+      +-------------+
| #product_id   |      | #product_id |
| #option_id    |      | #sku_id     |
|  option_name  |      | #option_id  |
+---------------+      |  value_id   |
        |              +------v------+
+-------^-------+             |
| OPTION_VALUES |-------------+
+---------------+
| #product_id   |
| #option_id    |
| #value_id     |
|  value_name   |
+---------------+
ログイン後にコピー

プライマリキー (PK)、一意キー (UK)、および外部キー(FK):

  • 製品

    • PK: product_id
    • 英国: product_name
  • OPTIONS

    • PK: product_id、option_id
    • UK: product_id、 option_name
  • OPTION_VALUES

    • PK: product_id、option_id、value_id
    • UK: product_id、option_id 、 value_name
    • FK: (product_id, option_id) 参照 OPTIONS(product_id, option_id)
  • PRODUCT_SKUS

    • PK: 製品 ID、 sku_id
    • 英国: sku_id
    • FK: product_id 参照PRODUCTS(product_id)
  • SKU_VALUES

    • PK: product_id、sku_id、option_id
    • FK: (product_id、sku_id) 参照PRODUCT_SKUS(product_id, sku_id)
    • FK: (product_id, option_id) は OPTIONS(product_id, option_id) を参照します
    • FK: (product_id, option_id, value_id) は OPTION_VALUES(product_id, option_id, value_id)

データの例

提供されたスプレッドシートの次のデータを使用します。

+-----------+----------+---------+----------+----------+
| ProductId | Product  | Size    | Color    | Class    |
+-----------+----------+---------+----------+----------+
| 1         | Widget 1 | Small   | White    | null     |
| 1         | Widget 1 | Small   | Black    | null     |
| 1         | Widget 1 | Large   | White    | null     |
| 1         | Widget 1 | Large   | Black    | null     |
| 2         | Widget 2 | Small   | null     | null     |
| 2         | Widget 2 | Medium  | null     | null     |
| 3         | Widget 3 | Medium  | null     | Amateur  |
| 3         | Widget 3 | Large   | null     | Amateur  |
| 3         | Widget 3 | Medium  | null     | Professional |
| 3         | Widget 3 | Large   | null     | Professional |
+-----------+----------+---------+----------+----------+
ログイン後にコピー

データは、テーブルは次のとおりです:

-- PRODUCTS
+-----------+----------+
| ProductId | Product  |
+-----------+----------+
| 1         | Widget 1 |
| 2         | Widget 2 |
| 3         | Widget 3 |
+-----------+----------+

-- OPTIONS
+-----------+---------+----------+
| ProductId | OptionId | OptionName  |
+-----------+---------+----------+
| 1         | 1       | Size       |
| 1         | 2       | Color      |
| 2         | 1       | Size       |
| 3         | 1       | Class      |
| 3         | 2       | Size       |
+-----------+---------+----------+

-- OPTION_VALUES
+-----------+---------+---------+----------+
| ProductId | OptionId | ValueId | ValueName  |
+-----------+---------+---------+----------+
| 1         | 1       | 1       | Small      |
| 1         | 1       | 2       | Large      |
| 1         | 2       | 1       | White      |
| 1         | 2       | 2       | Black      |
| 2         | 1       | 1       | Small      |
| 2         | 1       | 2       | Medium     |
| 3         | 1       | 1       | Amateur    |
| 3         | 1       | 2       | Professional |
| 3         | 2       | 1       | Medium     |
| 3         | 2       | 2       | Large      |
+-----------+---------+---------+----------+

-- PRODUCT_SKUS
+-----------+----------+-----+--------+
| ProductId | SkuId     | Sku | Price   |
+-----------+----------+-----+--------+
| 1         | 1         | W1SSCW  | 10.00 |
| 1         | 2         | W1SSCB  | 10.00 |
| 1         | 3         | W1SLCW  | 12.00 |
| 1         | 4         | W1SLCB  | 15.00 |
| 2         | 1         | W2SS    | 100.00 |
| 2         | 2         | W2SM    | 100.00 |
| 3         | 1         | W3CASM   | 50.00 |
| 3         | 2         | W3CASL   | 50.00 |
| 3         | 3         | W3CPSM   | 150.00 |
| 3         | 4         | W3CPSL   | 160.00 |
+-----------+----------+-----+--------+

-- SKU_VALUES
+-----------+----------+---------+---------+
| ProductId | SkuId     | OptionId | ValueId |
+-----------+----------+---------+---------+
| 1         | 1         | 1       | 1       | -- W1SSCW: Size; Small
| 1         | 1         | 2       | 1       | -- W1SSCW: Color; White
| 1         | 2         | 1       | 1       | -- W1SSCB: Size; Small
ログイン後にコピー

以上が私の EAV ベースの製品バリアント データベース設計は適切で、スケーラブルで、正規化されていますか? それとも、代替のリレーショナル設計の方がクエリとパフォーマンスが優れていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート