gpt4 book ai didi

mysql - 在多对多关系中选择特定属性

转载 作者:行者123 更新时间:2023-11-29 09:28:40 26 4
gpt4 key购买 nike

考虑我有这样的场景:

用户

| id | name |
|----|------|
| 1 | Joe |

属性

| id | name   |
|----|--------|
| 1 | Age |
| 2 | Height |
| 3 | Gender |

client_attribute

| id | client_id | attribute_id | value |
|----|-----------|--------------|-------|
| 1 | 1 | 1 | 45 |

属性可以扩展到数百个变体。当查询用户并选择“公共(public)”属性列时,例如“年龄”:

我的代码应该采用属性的名称或 ID 吗?如果不是,是否应该将常用访问属性直接放置到users 表中?如果这些共同属性不断扩展怎么办?

我的查询可能会在不同的区域中挑选出两个或三个属性,并且我发现这种表设计使事情变得困难(但我可以看到它的论据)。

最佳答案

给出的插图并不是实体之间真正的“多对多”关系。

所示表格是典型 EAV(实体属性值)实现的说明。

问:我的代码应该采用属性的nameid 吗?

答:通常,SQL 会通过id 引用attribute 行。但我们也可以使用 name 列。通常,应用程序代码将处理“选定”属性的转换。 (我们需要深入研究一些示例来进行说明。)

问:如果不是,是否应该将经常访问的属性直接放入用户表中?

答:传统的关系模型将有一个实体行(例如 user 表中的一行),每个属性都有一个单独的列:名字、姓氏、性别、出生日期、高度等

问:如果这些共同属性不断扩展怎么办?

在传统的关系模型中,我们会添加额外的列(DDL ALTER TABLE 操作)。使用 EAV 模型,我们不需要添加列,我们会向 attribute 表添加行(DML INSERT 操作)。

EAV 模型更复杂,因为属性值不存储在实体行中,而是作为单独表中的行,就像我们存储多值属性一样。正如您所注意到的,EAV 有一些优点,也有一些显着的缺点......

<小时/>

问:我的查询可能会在不同的区域中挑选出两个或三个属性,我发现这种表设计使事情变得困难

答:真正的复杂性(和性能问题)出现在尝试让 EAV 模型返回一行时,就像我们在传统关系模型中返回的那样;如果我们尝试编写一个查询,返回一行,该行看起来来自 user 表,每个属性都有单独的列。

如果我们采用 EAV,那么我们应该采用完整的 EAV,而不是尝试编写返回看起来像来自关系模型的结果集的 SQL。这是可能的,但查询会变得复杂。

<小时/>

此外,我不会存储“年龄”属性,因为它会随着时间而变化;一个人的年龄是当前日期和出生日期之间的差。

EAV 模型为新手提供了极大的灵 active 和易用性的 promise 。这种灵 active 是有代价的。考虑如何处理属性的各个域。名字和姓氏字符串可以存储为 VARCHAR,但某些属性可能是日期、小数、整数。我们是否要将所有属性存储为 VARCHAR,还是应该有多个列,然后使用某种判别器来告诉我们应该从哪个数据类型列中提取属性。

关于mysql - 在多对多关系中选择特定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59160509/

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