2010-08-31 94 views
0

我正在考虑如何在电子商务解决方案中构建我的MySQL数据库。更具体地说,我正在研究产品结构。产品的电子商务结构(MySQL)

这些是我到目前为止所提供的表格。你怎么看?

结构

的应用的说明是多种语言。因此产品表分成2个表格。

如果产品有例如2个变体(小,中)将插入总共3行。这是因为每个变体可以为每个变体都有不同的信息。当产品显示在网页上时,产品1将显示带有小号&中号的下拉框。没有变体的产品自然只会插入1行。

 
products 
id master product_number 
1 0  123 
2 1  456 
3 1  678

products_descriptions id product_id country_code image name description vat price 1 1 en-us image.jpg t-shirt Nice t-shirt 25 19.99 2 2 en-us image.jpg t-shirt Nice t-shirt 25 19.99 3 3 en-us image.jpg t-shirt Nice t-shirt 25 19.99

products_to_options product_id option_id 2 1 3 2

options id name 1 Small 2 Medium

回答

1

您的产品表是精神分裂症,其实体有时是产品,有时是变体。这导致非常繁琐的行为。例如,你想问“我们有多少种不同的产品?”由select count(*) from products回答,但这里给出了错误的答案,要得到正确答案,您必须知道Magic Number 0和查询select count (*) from products where master=0。 “列出所有产品以及我们对每个产品有多少变体”是另一个应该直截了当,但现在不是的查询。还有其他的异常情况,比如说products_descriptions中的第一行是一件有价格和图片但没有尺寸的衬衫(尺寸存储在变体中,但它们有自己的价格和图片)。

您的问题听起来像您有两种情况下的产品:(1)可以在商店中显示为商品的东西;(2)可由客户订购的商品。 (1)可能有一个像“万圣节T恤”这样的名字,它可能有一个客户看到的图像。 (2)是客户订购的,所以它有(1),但也有一个变体规格,如“小”或颜色“红”。它可能也有一个价格,并有一个order_id,所以你的店可以知道要发货的具体物品。

你应该给每个上下文一个实体。下面是我会做

displayable_product 
id name 
1 "Baseball Cap" 
2 "T-Shirt" 

orderable_product 
id d_product_id order_id size color price 
1 1   123    red  9.99 
2 2   456  small   19.99 
3 2   789  medium   21.99 

displayable_content 
id d_product_id locale name     image 
1 1    en_US "Baseball Cap"  baseballcap.jpg 
2 1    es_US "Gorra de Beisbol" baseballcap.jpg 
3 2    en_US "Nice T-Shirt"  nicetshirt.jpg 
4 2    es_US "Camiseta"   nicetshirt.jpg 

你应该使用locale,而不是country在显示表占个国家拥有超过一种语言(美国,瑞士和其他),你可能会分开sizecolor分成它自己的variants表。如果您需要关于可订购产品的国家相关数据(如向不同国家/地区发货的不同价格/货币),则您也必须提取依赖于国家/地区的可订购表格。

+0

有趣的例子。但是如果选项的数量未知,你会怎么做?像“Slewvless”一样?你应该正常化吗? – Cudos 2010-09-03 17:29:22

+0

我会尽量保持数据库正常化。在你的情况下,我会尝试将选项分成两个桶:(1)那些结构上的问题,他们可能最终会出现像“今年,如果红色,白色和蓝色是多少客户喜欢红色提供“,以及(2)类似于描述文本而不是类别的那些。理想情况下,bucket(2)将是空的,但在现实生活中,我可以大于(1)。但基本上,如果经常在查询中出现,我希望它正常化。如果仅用于描述中,则将其放入EAV表中即可。 – wallenborn 2010-09-03 23:16:53