2013-01-31 33 views
8

我在做一个电子商务项目,并感到困惑的数据库设计用于存储产品。有3种方式,我推测该数据库可制成:设计一个电子商务数据库 - MySQL的

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. 组中的所有产品一起在一个表中,并且允许一些值为空

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

我会很感激的启示,谢谢

回答

8

我假设一个产品可以属于很多类别,而一个类别(很明显)中有很多产品。这种关系被称为多对多关系。

在这种情况下,您将有三个表格:categories,productscategories_products。前两个表是不言自明的。第三个表格存储两个外键之间的关系。表看起来是这样的:

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; 

很明显,这些是最简单的表格模式。您需要将附加列添加到categoriesproducts表中 - 我只包括与关系相关的列。

编辑:我还添加了一个parent_id列到categories表嵌套类别。创建单独的sub_categories表通常是一个糟糕的主意 - 如果要将子类别设置为顶级类别,会发生什么情况?或相反亦然?你因为想要一个更好的短语而喋喋不休。

+0

谢谢你的帮助。我的主要问题是如何/在哪里为不同类型的产品存储不同的数据。即您是否会在产品表中为作者/ ISBN /颜色/尺寸/重量/等等添加一列,或者将它们分开以避免使用空值? – a7omiton

+0

我想有一个基地'products'表,然后也许像ISBN号的其他数据的'product_attributes'表,而不是每个产品都将有一个ISBN号码,如果它不是一个发布。 –

+0

所以方法3将是要走的路(除了sub_categories表)?还是你说所有产品的每个属性都应该放在表product_attributes中? – a7omiton

5

我认为这取决于产品的使用方法1或2。我永远不会使用方法3.

如果你的产品是完全地不同为什么要使用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  | 
  • 书籍,衣服带香水没有父母(这些是主要的 类别)。
  • 科幻和喜剧是图书(ID 1)的一个子类别。
  • 牛仔裤,毛衣和内衣是衣服(ID 2)一个子类别。
  • 长袖是毛衣(ID 7)的一个子类别。
  • 玫瑰是香水的一个子类别(ID 3)。
+0

ü可以解释一点进一步例如编辑我的回答与父ID的例子父ID –

+2

的。我希望你明白我对你知道我与我的网站做的头脑 – AgeDeO

+0

户外朋友和我通过复杂的方式我使用的方法1创建我的购物车哦LUC为什么我wouldnt有创作我的网站之前,我很欣赏你的努力并投票表示感谢 –

相关问题