webdevqa.jp.net

Eコマースデータベースの設計-MySQL

私は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?)

私は本当に悟りに感謝します、ありがとう

15
a7omiton

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

この例では、categoriesproducts、およびcategories_productsの3つのテーブルがあります。最初の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およびproductsテーブルに追加の列を追加する必要があります。ここでは、関係に関連する列のみを含めました。

編集:カテゴリをネストするために、categoriesテーブルにparent_id列も追加しました。一般に、別のsub_categoriesテーブルを作成することはお勧めしません。サブカテゴリをトップレベルのカテゴリにしたい場合はどうなりますか?またはその逆?あなたはより良いフレーズを求めて悩まされています。

10
Martin Bean

方法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       |
  • 本、洋服、香水には親がありません(これらは主なカテゴリーです)。
  • Sci-Fi and Comedyは、Books(ID 1)のサブカテゴリです。
  • ジーンズ、セーター、下着は、服のサブカテゴリです(ID 2)。
  • 長袖はセーター(ID 7)のサブカテゴリです。
  • バラは香水のサブカテゴリです(ID3)。
7
AgeDeO