【发布时间】:2016-09-24 17:10:39
【问题描述】:
我试图避免使用 EAV 模型,因为我希望属性具有适当的类型。但是我想决定是否应该为不同类型的产品创建多个属性表,还是只创建一个。
所有项目都是“产品”,所以我觉得它们属于一张桌子。但是,某些产品类型与其他产品类型不具有相同的属性。考虑以下几点:
Table: Product
- productID [INT]
- name [VARCHAR]
- type [FK]
Table: Product_Type
- productTypeID [INT]
- description [VARCHAR]
产品分为三种类型:主要产品、配件产品和供应产品。不同类型的产品共享许多属性,但不是全部。所以我想知道我是否要创建一个包含所有属性的属性表,并理解配件/用品不会使用一半的列或为每种类型的产品创建单独的属性表。
选项 #1:一个属性表
Table: Product_Attribute
- productID [FK]
- nameInternalCode [VARCHAR]
- nameExternalCode [VARCHAR]
- dateAnnouce [DATE]
- dateSell [DATE]
- serviceable [BIT]
- etc. etc. etc.
优点:前端逻辑 (PHP) 很简单,因为您只需要从一个表中选择产品属性。
缺点:虽然所有项目都是“产品”,但它们并不都具有相同的属性。因此,例如配件或耗材的行将包含永远不会包含数据的列。
这种做法被认为是不好的吗?要创建一个完全了解某些行永远不会包含某些列的数据的表?
选项 #2:两个/三个属性表
Table: Product_Main_Attribute
- productID [FK]
- nameInternalCode [VARCHAR]
- nameExternalCode [VARCHAR]
- dateAnnouce [DATE]
- dateSell [DATE]
- serviceable [BIT]
- etc. etc. etc.
Table: Product_Accessory_Attribute
- productID [FK]
- dateAnnouce [DATE]
- dateSell [DATE]
- serviceable [BIT]
- etc. (Shorter List)
Table: Product_Supply_Attribute
- productID [FK]
- serviceable [BIT]
- etc. (Shorter List)
优点:该表更好地代表了它负责的数据类型。不再有任何没有数据的列。
缺点:在前端 (PHP) 上创建额外的逻辑要求。必须首先确定是什么类型的产品才能知道从哪个表中读取属性。
【问题讨论】:
标签: sql attributes entity-attribute-value