加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:52:04 所属栏目:MsSql教程 来源:网络整理
导读:假设我们有一个应该能够存储所有类型产品的应用程序.每个产品至少具有ID和名称,但是所有其他属性可以由用户自己定义. 例如他可以创建一个包含属性容量和生成的产品组Ipods 例如他可以创建一个具有属性大小和颜色的产品组TShirts 我们需要存储产品的定义和具体
假设我们有一个应该能够存储所有类型产品的应用程序.每个产品至少具有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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读