18

私は e コマース プロジェクトを行っていますが、製品を保存するためのデータベース設計について混乱しています。データベースを作成できると私が推測した方法は 3 つあります。

1. 製品カテゴリごとに個別のテーブルが存在する場合があります。

Table: Categories
------------------
cat_ID
cat_name

Table: Sub_Categories
---------------------
sub_cat_ID
categories_cat_ID
sub_cat_name

Table: Books
-------------
book_ID
sub_categories_sub_cat_ID
book_title
book_author
book_ISBN
book_price
etc

Table: Clothes
---------------
clothes_ID
sub_categories_sub_cat_ID
clothes_name
clothes_color
clothes_size
clothes_description
clothes_price
etc

Table: Perfumes
----------------
perfumes_ID
sub_categories_sub_cat_ID
perfume_name
perfume_size
perfume_weight
perfume_description
perfume_price
etc

2. すべての製品を 1 つのテーブルにグループ化し、一部の値を null にできるようにする

Table: Categories
------------------
cat_ID
cat_name

Table: Sub_Categories
---------------------
sub_cat_ID
categories_cat_ID
sub_cat_name

Table: Products
---------------
product_ID
sub_categories_sub_cat_ID
title
description
price
author (can be null for everything except books)
size
weight (can be null for everything except perfumes)
ISBN (can be null for everything except books)
color (can be null for everything except clothes)
etc

3. 同様の列フィールドを製品と呼ばれるテーブルにグループ化し、特定のデータ用に個別のテーブルを提供します。

Table: Categories
------------------
cat_ID
cat_name

Table: Sub_Categories
---------------------
sub_cat_ID
categories_cat_ID
sub_cat_name

Table: Products
----------------
product_ID
sub_categories_sub_cat_ID
title
description
price

Table: Books
-------------
products_product_id
sub_categories_sub_cat_ID
author
publisher
ISBN

Table: Perfumes
----------------
products_product_id
sub_categories_sub_cat_ID
size
weight

Table: Clothes
--------------
products_product_id
sub_categories_sub_cat_ID
color
size (this can be a one to many relationship to cater to multiple sizes of one product?)

啓蒙を本当に感謝します、ありがとう

4

2 に答える 2

17

製品は多くのカテゴリに属する​​ことができ、カテゴリには (明らかに) 多くの製品が含まれていると思います。この関係は、多対多の関係と呼ばれます。

categoriesこの例では、 、products、およびの3 つのテーブルがありcategories_productsます。最初の 2 つの表は一目瞭然です。3 番目のテーブルには、2 つの外部キーを持つ 2 つの間の関係が格納されます。テーブルは次のようになります。

CREATE TABLE `categories` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(10) unsigned DEFAULT NULL,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `categories_products` (
  `category_id` int(10) unsigned NOT NULL,
  `product_id` int(10) unsigned NOT NULL,
  KEY `category_id` (`category_id`),
  KEY `product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `categories_products`
  ADD CONSTRAINT `categories_products_ibfk_2`
    FOREIGN KEY (`product_id`) REFERENCES `products` (`id`)
    ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `categories_products_ibfk_1`
    FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)
    ON DELETE CASCADE ON UPDATE CASCADE;

明らかに、これらは最も単純なテーブル スキーマです。categories追加の列をandテーブルに追加する必要がありますproducts。リレーションに関連する列のみを含めました。

編集:カテゴリをネストするためにテーブルにparent_id列も追加しました。categories一般に、別のsub_categoriesテーブルを作成することはお勧めできません。サブカテゴリをトップレベルのカテゴリにしたい場合はどうなるでしょうか? それともその逆?あなたはもっと良い言い回しが欲しくて困っています。

于 2013-01-31T12:31:17.717 に答える
10

方法1または2を使用する製品に依存すると思います。方法3は使用しません。

本、香水、衣類など、商品がまったく異なる場合は、方法 1 を使用します。

補足: なぜカテゴリに 2 つのテーブルを使用するのですか? 1 つのテーブルを使用し、Parent_ID 列を追加して、将来無制限のサブカテゴリを使用できるようにします。

例えば:

table: categories

|id|description|parentid|
|1 |books      |NULL    |
|2 |clothes    |NULL    |
|3 |perfumes   |NULL    |
|4 |Sci-Fi     |1       |
|5 |Comedy     |1       |
|6 |Jeans      |2       |
|7 |Sweater    |2       |
|8 |Underwear  |2       |
|9 |Long sleeve|7       |
|10|Roses      |3       |
  • Books、Clothes en Perfumes には親がありません (これらが主なカテゴリです)。
  • Sci-Fi and Comedy は Books (ID 1) のサブカテゴリです。
  • ジーンズ、セーター、下着は服のサブカテゴリです (ID 2)。
  • 長袖 は、セーター (ID 7) のサブカテゴリです。
  • バラは、香水 (ID 3) のサブカテゴリです。
于 2013-01-31T12:31:08.923 に答える