多属性模型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.

by Karl Bielefeldt.

基本上我的模型是student_report。根据实际形式有以下属性:

creatorrevision historydepartmentreferencesfundingcomments 是此表单将依赖的其他模型。

我最初的计划是创建 student_report,仅包含以下内容:

而其他的:revision historydepartmentreferencesfundingcomments 将拥有外键 student_report_id

对于variable/not固定模型如referencesfunding,我打算使用中介table连接student_form到"list" 标准化 DB:

我提出的解决方案是否足够?这将是一个小规模的项目,我怀疑这将需要每天使用数百次。

EAV 可帮助您在数据模型未被很好理解时捕获数据。它允许您跳过数据分析并提出一个非常灵活的设计table,无论数据的实际结构是什么,它都能处理大量数据。

但是有一个缺点。由于您在存储时没有分析数据,因此当您检索数据并将其变成有用的东西(例如报告或摘要)时,您必须分析数据。否则你的结果毫无意义。在某些情况下,这种负面影响可能比您之前经历的正面影响要大得多。

就您而言,您似乎对要存储的属性以及这些属性的语义有很好的理解。属性列表似乎也不太可能必须根据意外情况进行扩展。

所以我建议你避免使用 EAV,而是专注于如何用属性组合关系。关系只是属性的集合,以某种有意义且有用的方式组合在一起。如果您愿意,可以阅读有关此主题的书籍。

在SQL中,table表示关系。表有行,代表元组。表有代表属性的列。行和 table 的交集提供了一个可以存储值的位置。在 !NF 中,每个位置存储一个 "simple" 值。

我觉得你的设计很不错。我认为它会比 EAV 模型更好地为您服务。我不知道它是否完全归一化,我不确定它必须是。