sql – 如何为实体的自定义属性建模?

前端之家收集整理的这篇文章主要介绍了sql – 如何为实体的自定义属性建模?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我们有一个应该能够存储所有类型产品的应用程序.每个产品至少具有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

猜你在找的MsSQL相关文章