假设我们有一个应该能够存储所有产品的应用程序。每个产品至少具有anID和a,Name但其他所有属性都可以由用户自己定义。
ID
Name
您将如何根据上述要求对架构进行建模?
注意: 要求4.很重要!
感谢大家的贡献和讨论方法。我过去曾见过一些解决此问题的方法,但是没有一个对我来说容易分组:(
分组将变得不容易,因为您要在“颜色”上使用什么聚合运算符?请注意,案例2不能使用您的要求4。
无论如何,仅由于数据类型的差异而很难进行汇总,并且可以通过以更加类型安全的方式进行处理来减轻聚合-知道添加苹果和橙子绝对没有道理。
这是经典的EAV模型,在经过精心设计的数据库中占有一席之地。为了使它更具有类型安全性,我已经看到了将值存储在类型安全表中而不是单个自由格式varchar列中的情况。
代替值:
EntityID int ,AttributeID int ,Value varchar(255)
您有多个表:
EntityID int ,AttributeID int ,ValueMoney money EntityID int ,AttributeID int ,ValueInt int etc.
然后获取每一代的iPod容量:
SELECT vG.ValueVarChar AS Generation, SUM(vC.ValueDecimal) AS TotalCapacity FROM Products AS p INNER JOIN Attributes AS aG ON aG.AttributeName = 'generation' INNER JOIN ValueVarChar AS vG ON vG.EntityID = p.ProductID AND vG.AttributeID = aG.AttributeID INNER JOIN Attributes AS aC ON aC.AttributeName = 'capacity' INNER JOIN ValueDecimal AS vC ON vC.EntityID = p.ProductID AND vC.AttributeID = aC.AttributeID GROUP BY vG.ValueVarChar