2013-01-07 112 views
5

我想实现产品在类别中的过滤功能,我对正确的数据库架构有疑问。 现在我有如下表:产品属性的数据库架构

分类

1. id 
2. category 
3. description 

产品

1. id 
2. category_id 
3. product 
4. image 
5. price 

属性

1. id 
2. attribute 

Category_Attributes

1. category_id 
2. attribute_id 

和我有问题是我应该创建哪些表和哪些列喊他们来存储不同类型的值,属性值,产品属性值等

会这是正常的创建3个表:

1. id 
2. value 

Attributes_Values

1. attribute_id 
2. value_id 

Products_Attributes_Values

1. product_id 
2. attribute_id 
3. value_id 

我在最后的表搞砸。什么会更好地存储和过滤?

+0

你能解释一下你想用最后三张桌子想要达到什么吗?每张桌子的意图是什么?价值是否是一个标准清单?这个清单是否取决于类别?产品可以有多个属性值?如果没有更好地理解您的要求,很难给出建议。 –

+0

例如,我有类别“珠子”,它将有几个属性:直径,材料,包装。直径将为8毫米,10毫米,12毫米等,材料也可以改变塑料,木制,玻璃,金属,陶瓷。在管理区域中,我想要选择所有属性并选择唯一的一个选项。在目录中,我想自由过滤我的商品,例如我正在寻找直径10mm,12mm和材质陶瓷珠。 – UAMoto

+0

是的,每个类别都有其属性,这些属性将具有它们的值。 – UAMoto

回答

8

什么你正在努力实现是一个实体 - 属性 - 值(EAV),也可能是排造型解决方案。请注意,这种类型的结构在很大程度上被很多不好的理由所折服。

然而,我已经指出(例如hereherehere,和here),该EAV是邪,除了当它不是。除了需要检索这些内容并将其打印出来的情况之外,其中一种罕见的例外情况是您正在跟踪产品属性的产品目录,以及这些属性对您的系统不感兴趣(到您的系统!)一个产品网页或比较栅格等上

考虑这样的设计:

enter image description here

你在做什么在这样的模型描述其属性的产品在一个给定的类别应该拥有这些属性可能具有的价值,以及每种特定产品对ea具有的价值ch属性。

这种设计确实具有EAV强加的所有常见限制。但是,如果您想提问如下问题:“哪些珠子直径为8毫米?”这非常简单。

+0

如果我们使用'eav',我们不会遇到性能问题吗?如果我们面对你会给解决性能问题的建议,那么是否有任何方法来防止这种情况? – fresher

+0

@PhpBeginner是的,使用EAV可能会带来各种挑战,这就是为什么很多人认为它是反模式。我自己不会使用EAV,除非在特别适合EAV的特殊情况下。我认为[这里](http://stackoverflow.com/questions/11779252/entity-attribute-value-table-design/11972029#11972029)和其他地方,在线产品目录是其中的一个应用程序。在这种情况下,EAV不会成为性能问题,并且与应用完整语义数据建模相比,它将使用更简单的代码。 –