【发布时间】:2011-11-29 20:13:31
【问题描述】:
我开始销售 T 恤和鞋子的新电子商务 Web 应用程序(宠物项目)。我的商店只有免费尺寸的 T 恤,所以 T 恤只有颜色栏,而鞋子有尺寸和颜色栏。
现在是时候创建表来存储这些数据了,我想知道为鞋子和 T 恤创建单独的表好还是将它们都放在一个表中更好?
如果存储此类数据有更好的想法,请告诉我。
【问题讨论】:
我开始销售 T 恤和鞋子的新电子商务 Web 应用程序(宠物项目)。我的商店只有免费尺寸的 T 恤,所以 T 恤只有颜色栏,而鞋子有尺寸和颜色栏。
现在是时候创建表来存储这些数据了,我想知道为鞋子和 T 恤创建单独的表好还是将它们都放在一个表中更好?
如果存储此类数据有更好的想法,请告诉我。
【问题讨论】:
您绝对不想创建 Shoe 表和 TShirt 表。您的商店可能会增长,并且有一天您将拥有一千个这样的产品表。为此编写 SQL 将是一场噩梦。另外,你最终可能会有不同种类的 T 恤,有些有颜色,有些有尺寸和颜色,等等。如果你为每个人创建一个新表,你很快就会忘记它们,如果你不这样做,为什么要为 T 恤和鞋子设置单独的表,而不是为单一尺寸的 T 恤和多尺寸的 t -衬衫?
在设计数据库时,您应该问自己:我的领域中的实体是什么?什么是永不改变且唯一可识别的东西?在商店中,可以以特定价格出售的特定商品就是这样一个实体。因此,您可能有一个 products 表,其中包含您销售的每个特定商品的键,可能还有名称、类型、尺寸和颜色列:
item
id | type | name | size | color
------------------------------------
1 | shoe | Marathon | 9 | white
2 | shoe | Marathon | 9 | black
查看此表,您会注意到我们有两个非常成功的马拉松跑鞋条目,这似乎违反了规范化。实际上,您可能有两个实体,一个可发货项目和一个目录产品。鞋子“Marathon”可能是在您的商店中只有一张图片和一个描述,然后是“有以下颜色和尺寸可供选择:”行。所以现在你有两个表:
product
id | type | name | supplier | picture | description
--------------------------------------------------------------------------------------
1 | shoe | Marathon | TrackNField Co. | marathon.jpg | Run faster than light!
2 | tshirt | FlowerPower | SF Shirts | fpower.jpg | If you're going to San Francisco...
item
id | product_id | size | color | price
--------------------------------------
1 | 1 | 9 | white | 99.99
2 | 1 | 9 | black | 99.99
3 | 2 | | blue | 19.99
产品表中的“类型”列可能很棘手。您可能希望按类别显示产品,让用户单击“鞋子”并获取所有类型为“鞋子”的产品。到目前为止很容易,但最终有人会错误输入“sheo”条目,然后你就再也找不到鞋子下的那个产品了。因此,最好将分类与产品分开,例如使用 product_type 表:
product_type
id | name
---------
1 | shoe
product
id | type_id | name | supplier | picture | description
--------------------------------------------------------------------------------------
1 | 1 | Marathon | TrackNField Co. | marathon.jpg | Run faster than light!
引用产品表中的类型。只要您的类型层次结构保持浅层就可以了,但是如果您想要有子类别,例如“运动鞋”、“篮球鞋”、“麂皮鞋”等,该怎么办?一只鞋甚至可能属于这些子类别中的几个。这种情况你可以试试这个
category
id | name | supercategory_id
------------------------------------
1 | shoe |
2 | running shoe | 1
product_category
product_id | category_id
------------------------
1 | 2
product
id | name | supplier | picture | description
--------------------------------------------------------------------------------------
1 | Marathon | TrackNField Co. | marathon.jpg | Run faster than light!
如果您想要显示多个分类层次结构(就像现在大多数大型电子商务网站所做的那样),您将不得不想出更复杂的东西。
【讨论】:
将它们全部放在一个表中,并有一个type 字段。这样做的原因是为了让您的数据结构具有可扩展性:即,如果有一种新类型的产品,那么您不必添加新表并且必须彻底更改您的应用程序代码,您只需使用同一个表并简单地添加type。
【讨论】:
如果您不想让它变得复杂,您可以将它们全部放在同一个表中,并创建另一个名为“ProductType”的表,告诉您它是鞋子还是 T 恤。 这种关系在“ProductType”端是一对多的,因为您可以在产品表(您存储所有产品的位置)上拥有与多个记录相关联的相同类型的产品
【讨论】: