多属性模型EAV数据库设计(其他模型)
EAV database design for model with multiple attributes (other models)
我有一个模型,它拥有很多具有多个值的属性,这些值要么是列表的表示,要么是其他模型。我的研究让我考虑用 Entity-Attribute-Value design 来表示这种情况,但我看到更多来自更有知识的人的劝阻而不是建议。
最让我印象深刻的是这条评论:
In a nutshell, EAV is useful when your list of attributes is frequently growing, or when it's so large that most rows would be filled with mostly NULLs if you made every attribute a column. It becomes an anti-pattern when used outside of that context.
基本上我的模型是student_report
。根据实际形式有以下属性:
- id
- 创作者
- 修订历史
- 部门
- 参考资料
- 资金(可选,variable/not固定)
- 评论
- 目标(段)
- 范围(段)
creator
、revision history
、department
、references
、funding
和 comments
是此表单将依赖的其他模型。
我最初的计划是创建 student_report
,仅包含以下内容:
- id
- 创建者 ID
- 目标
- 其他段落式内容
而其他的:revision history
、department
、references
、funding
和 comments
将拥有外键 student_report_id
。
对于variable/not固定模型如references
和funding
,我打算使用中介table连接student_form
到"list" 标准化 DB:
student_report
| id | name |
|----|-----------------|
| 1 | Abraham Smith |
| 2 | Betty Gladstone |
| 3 | Chen Hong |
references
| id | name |
|----|--------------|
| 1 | Reference 1 |
| 2 | Reference 2 |
| 10 | Reference 10 |
report_references
| user_id | reference_id |
|---------|--------------|
| 1 | 2 |
| 1 | 3 |
| 2 | 10 |
我提出的解决方案是否足够?这将是一个小规模的项目,我怀疑这将需要每天使用数百次。
EAV 可帮助您在数据模型未被很好理解时捕获数据。它允许您跳过数据分析并提出一个非常灵活的设计table,无论数据的实际结构是什么,它都能处理大量数据。
但是有一个缺点。由于您在存储时没有分析数据,因此当您检索数据并将其变成有用的东西(例如报告或摘要)时,您必须分析数据。否则你的结果毫无意义。在某些情况下,这种负面影响可能比您之前经历的正面影响要大得多。
就您而言,您似乎对要存储的属性以及这些属性的语义有很好的理解。属性列表似乎也不太可能必须根据意外情况进行扩展。
所以我建议你避免使用 EAV,而是专注于如何用属性组合关系。关系只是属性的集合,以某种有意义且有用的方式组合在一起。如果您愿意,可以阅读有关此主题的书籍。
在SQL中,table表示关系。表有行,代表元组。表有代表属性的列。行和 table 的交集提供了一个可以存储值的位置。在 !NF 中,每个位置存储一个 "simple" 值。
我觉得你的设计很不错。我认为它会比 EAV 模型更好地为您服务。我不知道它是否完全归一化,我不确定它必须是。
我有一个模型,它拥有很多具有多个值的属性,这些值要么是列表的表示,要么是其他模型。我的研究让我考虑用 Entity-Attribute-Value design 来表示这种情况,但我看到更多来自更有知识的人的劝阻而不是建议。
最让我印象深刻的是这条评论:
In a nutshell, EAV is useful when your list of attributes is frequently growing, or when it's so large that most rows would be filled with mostly NULLs if you made every attribute a column. It becomes an anti-pattern when used outside of that context.
基本上我的模型是student_report
。根据实际形式有以下属性:
- id
- 创作者
- 修订历史
- 部门
- 参考资料
- 资金(可选,variable/not固定)
- 评论
- 目标(段)
- 范围(段)
creator
、revision history
、department
、references
、funding
和 comments
是此表单将依赖的其他模型。
我最初的计划是创建 student_report
,仅包含以下内容:
- id
- 创建者 ID
- 目标
- 其他段落式内容
而其他的:revision history
、department
、references
、funding
和 comments
将拥有外键 student_report_id
。
对于variable/not固定模型如references
和funding
,我打算使用中介table连接student_form
到"list" 标准化 DB:
student_report
| id | name | |----|-----------------| | 1 | Abraham Smith | | 2 | Betty Gladstone | | 3 | Chen Hong |
references
| id | name | |----|--------------| | 1 | Reference 1 | | 2 | Reference 2 | | 10 | Reference 10 |
report_references
| user_id | reference_id | |---------|--------------| | 1 | 2 | | 1 | 3 | | 2 | 10 |
我提出的解决方案是否足够?这将是一个小规模的项目,我怀疑这将需要每天使用数百次。
EAV 可帮助您在数据模型未被很好理解时捕获数据。它允许您跳过数据分析并提出一个非常灵活的设计table,无论数据的实际结构是什么,它都能处理大量数据。
但是有一个缺点。由于您在存储时没有分析数据,因此当您检索数据并将其变成有用的东西(例如报告或摘要)时,您必须分析数据。否则你的结果毫无意义。在某些情况下,这种负面影响可能比您之前经历的正面影响要大得多。
就您而言,您似乎对要存储的属性以及这些属性的语义有很好的理解。属性列表似乎也不太可能必须根据意外情况进行扩展。
所以我建议你避免使用 EAV,而是专注于如何用属性组合关系。关系只是属性的集合,以某种有意义且有用的方式组合在一起。如果您愿意,可以阅读有关此主题的书籍。
在SQL中,table表示关系。表有行,代表元组。表有代表属性的列。行和 table 的交集提供了一个可以存储值的位置。在 !NF 中,每个位置存储一个 "simple" 值。
我觉得你的设计很不错。我认为它会比 EAV 模型更好地为您服务。我不知道它是否完全归一化,我不确定它必须是。