gpt4 book ai didi

database-design - 在eav设计中可以有一个具有多个值的属性吗?

转载 作者:行者123 更新时间:2023-12-05 00:07:02 28 4
gpt4 key购买 nike

我正在使用EAV进行数据库设计。当我尝试为具有多个值的属性的实体建模时遇到问题?

例如

实体

id         | name           | description
-- | ---- | ------------
1 | configuration1 | configuration1


属性

id         | entityId    | name  | type
-- | -------- | ---- | ----
1 | 1 | att1 | string
2 | 1 | att2 | int
3 | 1 | att3 | List<String> (How will i model this?)




id        | attributeId    | value
-- | ----------- | -----
1 | 1 | a
2 | 2 | 1
3 | 3 | b
4 | 3 | c
5 | 3 | d


这是处理值列表的正确方法吗?

请提供任何有用的链接来对此建模吗?

还有两个问题

1)列表类型正确吗?我想确定的是,当一个属性具有多个值时,我会将类型指定为List

2)当属性对应于一个对象时,数据库设计将如何改变?例如,用户有地址。我将如何处理复合参数?

如果您能为我提供一个粗略的表格表示形式或图表,那将是很好的

谢谢

舍哈尔

最佳答案

是!在EAV中很可能具有多值属性属性。
实际上,它比传统的关系模型要容易得多,在传统的关系模型中,要么需要创建一个额外的列,要么需要使用定界的排序格式存储多个值;在数据库中查询基础字段(属性)的给定值时,这两种方法都会增加复杂性。

具有多个值的最简单方法就是简单地记录一个额外的值! (如问题所示)
此外,可以通过以下方式更改EAV存储结构以显式容纳多值:


属性表中的一个额外的类似布尔值的字段,指示该字段可以为多值还是不能为多值。 (顺便说一句,属性的相似属性也可以被编码,例如是否需要属性等等
值表可以得到一个额外的列,以指示该值的序列号(对于所有非多值属性,将其设置为0或1,否则为递增的整数)。


如前所述,对EAV存储的物理模式的这些更改不是必需的,但可以用于确保数据符合(逻辑)模式,以及可能在特定情况下显示多值属性的多个值订单等

编辑:(有关实现多值和/或复合(“类对象”)属性的详细信息)
如果您完全肯定构成属性的多个[“ sub”-]值(或类似地构成“对象类型”属性的多个部分)完全是原子的,即永远不会搜索或显示(或.. 。),您可以通过将多个值编码为单个字符串,将此类属性的值“集合”存储为值表中的单个记录;为此,想到了JSON或一般的XML,对于非常可扩展的/泛型的来说似乎特别有趣,但是您可以以可靠的方式解析出的任何其他格式(也就是定界格式)也可以使用。

存储此类“属性值部分”的一种更“自然”的方式(EAV方式)是通过将其单独存储(在值表的多个记录中,可能具有前面提到的序列字段)。这种方法允许在某些情况下将“子部分”当作属性来处理。

在这两种情况下,都需要更改属性表以添加必要的属性和类型代码,以描述此类多部分属性。与存储数据(在值表中)的方法类似,您可以进行属性记录,以便将给定[multi-part]属性的所有信息存储在单个属性记录中,或者,[并且这是通常可以更轻松,更灵活]],您可以为每个零件创建一个属性,再添加一个属性以“将它们绑在一起”(例如,其属性包含一个包含子部分每个属性ID值的字符串)。

例如:
金属管道项目的复合属性可以是直径,它由两部分组成:数值和单位代码(毫米,英寸)。
使用第一种方法:
-在属性表中将有一条记录,其类型指示这是一个多值,并且具有扩展属性以包含各个子部分的类型的[有序]列表。
-值表中将有一条记录,其中包含一个编码值,例如“ 0.75 | Inch”(或<diam>0.75</diam><unit>Inch</unit>)。
使用第二种方法:
-在属性表中将有3条记录:一条记录​​或类型为数字且名称为“ diamvalue”的记录,一条类型为字符串的记录(名称为“ unit”)和一条组合名称为“ Diameter”的记录;最后一条记录将以某种方式引用其他两个属性的ID(想到一个用逗号分隔的简单字符串)
-值表中将有两条记录,直径值和单位属性各一条(此类记录将具有一个附加字段,称为“父”,其中包含“直径”属性的AttributeID。可选地,还可以有一个“直径”(Diameter)属性的值记录[我个人认为这与“父”(parent)属性是多余的。

如前所述,第二种解决方案的主要优点是,[在适当时]可以根据属性部分的值在目录中查询一组特定的项目,例如搜索具有度量单位的所有管道。这些查询是在SQL级别解决的,因此,采用第一种方法,SQL将必须扫描属性“直径”的所有属性值并解析该值以搜索单元代码。

图片价值一千个字;-)
该图显示了带有“第二种方法”的示例数据的可能布局。

Entity 
id | name | description
-- | ---- | ------------
1 | configuration1 | configuration1

Attribute
id | name | type | Required | Repeats | SubAttribIdList
-- | ---- | ---- | -------- | ------- | ---------------
1 | att1 | string | N | N | null (only applicable to composite types)
2 | att2 | int | Y | N | null
3 | att3 | string | Y | Y | null
4 | DiamValue | numeric | Y | N | null
5 | Unit | string | Y | N | null
6 | Diameter | composite| N | N | 4,5

Value
id | entityId| attributeId | ParentAttribId |SeqNr | value
-- | --------| ----------- | -------------- |----- | -----
1 | 1 | 1 | null | 1 | a
2 | 1 | 2 | null | 1 | 1
3 | 1 | 3 | null | 1 | b (this value and next show show a repeating attribute)
4 | 1 | 3 | null | 2 | c
5 | 1 | 3 | null | 3 | d
6 | 1 | 4 | 6 | 1 | 0.75 (this value and next one shows a composite attribute
7 | 1 | 5 | 6 | 1 | Inches


一些注意事项:
-值id 6和7的SeqNr均为1。它们的顺序对于SubAttribIdList是隐式的。如果将属性ID 6设置为多值(“重复”)属性,则实体可以具有两个值的附加对,分别是成对,2、3等。
-系统将不可重复属性的序列号设置为1,这也可能为NULL,这不适用。
-属性的“必需”属性未在多值或复合问题中显示;我刚刚添加了它,因为它通常用于帮助应用程序(或实体访问层)实施各种完整性规则。
-此布局中的一些设计选择暗示组合属性最多包含1个包含级别(组合不能包含在组合中),并阻止组合包含多值属性。可以通过适当的结构来避免这些限制(并在接入层中增加一些复杂性),但是通常可以接受更简单的模式(需要这种奇特结构的属性通常表示逻辑模式存在缺陷) 。

关于database-design - 在eav设计中可以有一个具有多个值的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2452370/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com