我正在开发一个电子商务网站,但我对数据库设计很了解。
我有 3 张桌子:
- 产品(id、category_id、subcategory_id、名称)
- 类别(ID、名称)
- 子类别(id、category_id、名称)
例如:产品(脱衣 T 恤)属于类别(时尚)和子类别(T 恤)
如果我想为这个产品增加尺码怎么办?我应该在产品表中创建另一个表名“尺寸”和 size_id 吗?
但是,对于另一个类别(例如小工具/手机)没有大小。设计这个数据库的最佳选择是什么?
首先,我不会在产品上有类别 ID 和子类别 ID。它只属于一个子类别。如果需要,您可以通过子类别找到父类别。
products (id, subcategory_id, name)
categories (id, name)
subcategories (id, category_id, name)
对于所有产品可能不同的属性,您可以这样做:
attribute_types (id, name)
attributes (id, attribute_type_id, value)
products_attributes (id, product_id, attribute_id)
因此,在您的 attribute_types 表中,您可能有:
id | name
-----------------------------
1 | T-Shirt Size
2 | Shoe Size (US)
3 | Colour
4 | Batteries Included
在您的属性表中:
id | attribute_type_id | value
------------------------------
1 | 1 | Small
2 | 1 | Medium
3 | 1 | Large
4 | 2 | 9
5 | 2 | 9.5
6 | 2 | 10
7 | 2 | 10.5
8 | 2 | 11
9 | 3 | Red
10 | 3 | Blue
11 | 3 | Green
12 | 3 | Yellow
13 | 3 | Black
14 | 4 | Yes
15 | 4 | No
然后在您的 products_attributes 表中,您只需添加该产品具有的任何属性:
id | product_id | attribute_id
------------------------------
1 | 456 | 6
2 | 456 | 13
因此,对于该产品,它是 10 号鞋,黑色。
Magento 是一个巨大的商店解决方案,它使用EAV解决了这个问题。EAV 很灵活,但性能不如专用桌子解决方案。
您的 Category -> Subcategory 没有多大意义。阅读嵌套集或在同一类别表中使用纯父子关系。
我认为你只能有两个表/模型。您必须在类别模型上设置树行为。
class Category extends AppModel {
public $actsAs = array('Tree');
}
然后你必须在你的 database.categories 中添加一些列:
EAV 风格很有用,但很难管理。我认为您也可以为您的产品模型使用可包含行为,并为您想要的每个类别制作新的模型。就像这里的例子:
当您找到一个产品时,您将获得一个包含您的 bd.products 和基本信息的数组,以及另一个基于 db.eachModelYouWant 的数组。
无论如何,您还应该有一个表来管理 inStock 或不通过关系 hasManyAndBelongsTo。:-) 所以尝试检查 databaseanswer 有很多设置!
如果某些产品的尺寸是固定的或已知的,您可以根据自己的建议制作尺寸表,但如果它是可变的,您可以在产品表中制作尺寸字段,并为没有尺寸的产品设置为空。