我有一个模型,它拥有许多具有多个值的属性,这些值要么是列表的表示,要么是其他模型。我的研究让我考虑了一个 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
。根据实际形式,它有以下属性:
- 编号
- 创作者
- 修订历史
- 部门
- 引用资料
- 资金(可选,可变/不固定)
- 评论
- 目标(段落)
- 范围(段落)
创建者
、修订历史
、部门
、引用资料
、资金来源
和comments
是此表单将依赖的其他模型。
我最初的计划是创建仅包含以下内容的student_report
:
- 编号
- 创作者id
- 目标
- 其他段落式内容
而其他的:revision history
、department
、references
、funding
和comments
code> 将拥有外键 student_report_id
。
对于references
和funding
等可变/非固定模型,我打算使用中介表将student_form
连接到“规范化数据库的列表”:
student_report
| id | name | |----|-----------------| | 1 | Abraham Smith | | 2 | Betty Gladstone | | 3 | Chen Hong |
引用资料
| id | name | |----|--------------| | 1 | Reference 1 | | 2 | Reference 2 | | 10 | Reference 10 |
report_references
| user_id | reference_id | |---------|--------------| | 1 | 2 | | 1 | 3 | | 2 | 10 |
我提出的解决方案是否足够?这将是一个小规模的项目,我怀疑这将需要每天使用数百次。
最佳答案
EAV 可帮助您在数据模型未被很好理解时捕获数据。它允许您跳过数据分析,并提出一个单一的设计,该设计具有很强的适应性,无论数据的实际结构是什么,它都能处理大量数据。
但是有一个缺点。由于您在存储时没有分析数据,因此当您检索数据并将其变成有用的东西(例如报告或摘要)时,您必须分析数据。否则你的结果毫无意义。在某些情况下,这种不利因素可能比您之前经历的有利因素大得多。
在您的情况下,您似乎对要存储的属性以及这些属性的语义有很好的理解。属性列表似乎也不太可能必须根据意外进行扩展。
所以我建议你避免使用 EAV,而是专注于如何用属性组合关系。关系只是属性的集合,以某种有意义且有用的方式组合在一起。如果愿意,您可以阅读有关此主题的书籍。
在 SQL 中,表代表关系。表有行,代表元组。表有代表属性的列。行和表的交集提供了一个可以存储值的位置。在 !NF 中,每个位置存储一个“简单”值。
我觉得你的设计很不错。我认为它会比 EAV 模型更好地为您服务。我不知道它是否完全正常化,我不确定它必须如此。
关于database - 多属性模型EAV数据库设计(其他模型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39117875/