假设我们有一个应该能够存储所有类型产品的应用程序.每个产品至少具有ID和名称,但是所有其他属性可以由用户自己定义.
>例如他可以创建一个包含属性容量和生成的产品组Ipods
>例如他可以创建一个具有属性大小和颜色的产品组TShirts
>我们需要存储产品的定义和具体产品本身.
>我们希望确保按产品属性轻松聚合(GROUP BY).例如.选择每代ipod的容量总和
>解决方案不得要求架构更改(由于Bill Karwin的输入而增加了要求 – 请参阅他的答案!)
您如何根据上述要求对架构进行建模?
注意:要求4.很重要!
解决方法
分组并不容易,因为你要在“颜色”上使用哪个聚合运算符?请注意,无法在案例2中使用您的要求4.
在任何情况下,由于数据类型的变化,聚合只是困难,并且可以通过以更加类型安全的方式接近它来减轻 – 知道添加苹果和橙子永远不会有意义.
这是经典的EAV模型,它在精心设计的数据库中占有一席之地.为了使其更加类型安全,我已经看到了这些值存储在类型安全表而不是单个自由形式varchar列中的情况.
而不是价值观:
EntityID int,AttributeID int,Value varchar(255)
你有多个表:
EntityID int,ValueMoney money EntityID 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