database - 多属性模型EAV数据库设计(其他模型)

标签 database forms database-design model entity-attribute-value

我有一个模型,它拥有许多具有多个值的属性,这些值要么是列表的表示,要么是其他模型。我的研究让我考虑了一个 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。根据实际形式,它有以下属性:

  • 编号
  • 创作者
  • 修订历史
  • 部门
  • 引用资料
  • 资金(可选,可变/不固定)
  • 评论
  • 目标(段落)
  • 范围(段落)

创建者修订历史部门引用资料资金来源comments 是此表单将依赖的其他模型。

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

  • 编号
  • 创作者id
  • 目标
  • 其他段落式内容

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

对于referencesfunding等可变/非固定模型,我打算使用中介表将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/

相关文章:

java - 在 postgresql 中通过 hibernate 保存 java 日期时的 GWT 日期选择器格式问题

javascript - 如何记住未提交的表单数据?

javascript - 是否可以通过 ajax 提交表单的一部分和表单 'normally' 的另一部分?

php - 沉迷于 Yii 框架表单教程

mysql - 为审计目的选择一个选项

mysql - 如何实现和插入值 SQL 特化/通用化

mysql - 以绩效为中心的声誉的数据库设计

sql - SQLite和范围查询

database - 如何生成部署到不同 PostgreSQL 数据库或从中缺失的 DDL 对象或函数的列表

sql-server - SQL Server Xml 列最佳实践