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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...