数据库设计:EAV 选择?

2024-01-01

这只是一个数据库概念问题:以下 EAV 模型的优缺点是什么?

Model 1:

TABLE: attribute_value
======================================
| id | fk_id | attribute | value     |
======================================
| 1  | 10    | FName     | John      |
| 2  | 10    | Lname     | Doe       |
| 3  | 55    | FName     | Bob       |
| 4  | 55    | Lname     | Smith     |
--------------------------------------

Model 2:

TABLE: attribute
==================
| id | attribute |
==================
| 1  | FName     |
| 2  | Lname     |
------------------

TABLE: value
=====================================
| id | attribute_id | fk_id | value |
=====================================
| 1  | 1            | 10    | John  |
| 2  | 2            | 10    | Doe   |
| 3  | 1            | 55    | Bob   |
| 4  | 2            | 55    | Smith |
-------------------------------------

我认为 Model 2 的一个好处是attribute不包含重复项。


尽管如图所示是极简的,但 Model2 的属性表引入了以下概念:元数据融入其中,并从中获得所有好处。 Model2 还有其他优点,例如绩效提升与较小的行大小(值表)相关,但我想重点关注元数据概念。

Even as-isModel2的属性表构成所有有效属性的存储库(对于 model1,需要运行某种聚合查询才能获得这样的列表)。还有,还有as-is,存储库足以引入外键约束帮助维护数据集的完整性(对于模型 1,需要对属性列中存储的值进行外部形式的验证。

通过一些简单的添加,属性表可以成为一个多功能的存储库,可用于各种目的。例如,该表可能包括以下一些内容

  • 信息,例如每个属性的易于显示的名称
  • 一些指示字段类型的标志(数字、字符串、日期等),用于区分处理/处理
  • 存储基础属性的特定值表(模型仅显示一个表,但优化/缩放有时会提示拆分表)
  • 事实上,该属性可以作为其自己的列存储在“值”表中(同样是一种优化形式,本质上是两全其美:EAV 模型模式的灵活性和传统关系模型的性能)所有实体最常用和/或最常见的属性。
  • 能够在不影响主表的情况下重命名属性。仅在元数据级别进行更改。
  • 各种面向应用的语义。例如,应提供特定属性作为基本搜索字段与高级搜索字段之一的指示符。

简而言之,属性表成为一种资源,使应用程序能够真正实现数据驱动(或者更准确地说,meta数据驱动)。事实上,您可能还喜欢实体表,即收集与各种实体类型相关的元数据的表:哪些是不同的实体类型,哪些属性允许哪些实体类型等。

现在...请注意来自的评论zerkms,位于问题本身下方。尽管有这么多优点,EAV 模型也有其缺点和挑战,正如所暗示的查询的复杂性以及性能问题。然而,这些担忧不应先验地取消 EAV 的资格:在许多用例中,EAV 是更好的方法。
假设选择 EAV,那么 Model2,甚至稍微复杂一点的东西肯定优于 model1。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库设计:EAV 选择? 的相关文章

  • 同时使用 GUID 和自动递增整数

    我一直在研究使用 GUID 作为数据库中的主键 到目前为止 利似乎大于弊 然而 我发现 GUID 可能不是我想要的 在我的应用程序中 用户应该能够根据用户友好的 ID 来识别对象 因此 例如 如果他们想要获取特定产品而不输入全名 则可以使用
  • MySQL 8 用逗号分割字符串并将其转换为JSON ARRAY

    我有以下字符串 a b c d 我想将它转换成一个 json 数组 像这样 a b c d MySQL 8 有什么函数可以实现这个功能吗 Try SELECT CAST CONCAT REPLACE a b c d AS JSON See
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • PHP MYSQL文件内容转义问题

    我正在尝试使用 php 将 pdf 文件上传到 mysql 数据库中 除了文件内容之外 一切都很好 无论我如何尝试转义特殊字符 查询总是失败 主要是 未知命令 n 我使用过addslashes mysql real escape strin
  • PHP 和 MySQL - 高效处理多个一对多关系

    我正在寻求一些有关使用 MySQL 和 PHP 检索和显示数据的最佳方法的建议 我有 3 个表 所有一对多关系如下 Each SCHEDULE有很多覆盖每个覆盖都有很多地点 我想检索这些数据 以便它可以全部显示在单个 PHP 页面上 例如列
  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • Android Realm.io:行/对象不再有效

    这是我的删除功能 它确实找到了workday1 object public static void delete Context context Workday workday Realm realm getRealm context re
  • 在 jQuery AJAX 成功中从 MySql 获取特定响应

    好吧 我有这个 ajax 代码 它将在 Success 块中返回 MySql 的结果 ajax type POST url index php success function data alert data My Query sql SE
  • 如何从批量数据中的mysql列中删除所有非数字字符

    我想从列中删除所有非数字字符 我的数据库中有大量数据 目前我正在使用以下链接中描述的方法 http venerableagents wordpress com 2011 01 29 mysql numeric functions http
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • rake db:migrate db:reset 和 db:schema:load 之间的区别

    和 之间的不同rake db migrate and rake db reset我很清楚 我不明白的是如何rake db schema load与前两者不同 只是为了确保我在同一页面上 rake db migrate 运行尚未运行的迁移 r
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • 如何处理数据库中的巨大结果集

    我正在设计一个多层数据库驱动的 Web 应用程序 SQL 关系数据库 用于中间服务层的 Java 用于 UI 的 Web 语言其实并不重要 中间服务层执行数据库的实际查询 用户界面只是要求某些数据 并不知道它是由数据库支持的 问题是如何处理
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我

随机推荐

  • 导轨捆绑清洁

    更新捆绑包后 您将拥有一些可能已过时的 gem 因为已安装该 gem 的较新版本 下没有这样的命令bundle可执行的 即bundle clean 如何摆脱这些过时的宝石 这是减少我的 Rails 应用程序中的 slug 大小的尝试 如果您
  • Kibana v 7.9.2 小时_分钟_秒的精确格式

    我跟着 and https www elastic co guide en elasticsearch reference current mapping date format html https www elastic co guid
  • ApplicationContext 事件从未被抛出

    我正在努力拥有ContextEventListener在所有 ContextXXXEvent 上 我为每个事件类型创建了一个侦听器 如下所示 ContextRefreshedEvent是一个例子 Component public class
  • 让一个函数“返回”超级函数?

    给出的是以下代码 function two return success function one two return fail 如果您通过调用函数 one 来测试代码 您将始终得到 失败 问题是 如何通过仅调用函数二 来在函数一 中返回
  • Textview 环绕 View [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我试图让我的水平布局充分利用可用的空间 在显示活动的信息中 我有一个 事实框 后面跟着一大框文本 我希望信息框向右浮动 类似于下图 使
  • 无需输入类名即可获取枚举?

    我注意到在 C 中 当我有一个 Enum 时 请说 class ClassObject public static Enum EventType Click Jump Etc 当我必须访问它时 我必须浏览它的主类 它非常冗长 例如 Clas
  • 将子菜单添加到 Visual Studio 项目项节点

    右键单击文件项 Visual Studio 解决方案资源管理器时如何添加菜单和子菜单项 我有一个菜单和三个子菜单项 当我右键单击解决方案资源管理器中的文件时 将显示这些菜单项 如下图所示 我尝试使用 vsct 按钮 但它将显示在上下文菜单上
  • 无法安装 MySQL-python

    我想在 python 2 7 虚拟环境中安装 MySQL python 但出现以下错误 Installing collected packages MySQL python Running setup py install for MySQ
  • 安卓:应用程序未安装

    这里是新手 我用Godot游戏引擎制作了我的第一个游戏并成功导出到android 复制到我的手机上 它安装并运行良好 几个小时后 我做了一些更改并再次导出 再次复制了 apk 但现在当我尝试安装它时 它没有完成安装 我多次尝试更改导出设置
  • 在 Android 上检测 wifi IP 地址?

    我需要确定Android设备是否连接到Wifi 如果是 则获取其Wifi IP地址 我知道如何使用 ConnectivityManager 来确定活动网络是否是 Wifi 网络 并且我知道如何使用 java net NetworkInter
  • Python 的 socket.getaddrinfo/mercurial 未使用持久 DNS 缓存

    当我通过一台调制解调器 ISP 连接时 我的 Ubuntu 机器上的 DNS 查找速度非常慢 我按照说明进行操作 例如here http aacable wordpress com 2011 06 13 ubuntu persistent
  • Swing 对话框如何工作?

    如果您在 Swing 中打开一个对话框 例如 JFileChooser 它有点类似于以下伪代码 swing event thread create dialog add listener to dialog close event retu
  • 检测到 glibc:双重释放或损坏

    我将解释我已完成的简短编码步骤以及我面临问题的区域 main cpp int main int cnt map i 1 value My question is about this char pointer key char key ch
  • Makefile:调用变量时如何增加变量? (bash 中的 var++)

    这是我的 makefile 的一部分 LISTEINC DEST file inc DEST otherfile inc DEST anotherfile inc compteur 1 DEST file LISTEINC action D
  • Airflow“此 DAG 在网络服务器 DagBag 对象中不可用”

    当我将新的 DAG python 脚本放入 dags 文件夹中时 我可以在 DAG UI 中查看 DAG 的新条目 但它并未自动启用 最重要的是 它似乎也没有正确加载 我只能点击列表右侧的 刷新 按钮几次 然后切换列表左侧的开 关按钮才能安
  • Eclipse Mars 不显示 Jboss 服务器

    这是我尝试过的事情 在 Eclipse Mars 中 转到 帮助 gt 安装新软件 单击添加按钮并粘贴更新站点的 URL 在我们的示例中 适用于 Jboss 的 Eclipse Mars 工具 http download jboss org
  • Google Play 警告有关缺少后倾意图的警告

    在 Google Play 上更新我们的应用程序时 我得到 You opted in to Android TV but your APK or Android App Bundle does not have the Leanback i
  • 让 HTML 页面仅播放 Flash 影片一次(不在重新访问时...)

    如何让一个 HTML 页面只播放一次 Flash 动画 即当一个人返回该页面时 Flash 不会从头开始再次播放 而只会显示动画的最后一帧 甚至最后一帧的简单 jpg 图像 有可能吗 谢谢 L 您可以在用户第一次访问时保存一个 cookie
  • 如果我们从集成流中删除最新版本会有副作用吗?

    我们已经向测试团队交付了一些包 他们完成了测试 在其中一个包中 他们报告了一个缺陷 该缺陷已被修复并交付给集成流 但在交付时 它要求重新设定基准 并且交付包含重新设定基准活动 在变基活动中 由于合并问题 其中一个文件在没有缺陷的包中被修改
  • 数据库设计:EAV 选择?

    这只是一个数据库概念问题 以下 EAV 模型的优缺点是什么 Model 1 TABLE attribute value id fk id attribute value 1 10 FName John 2 10 Lname Doe 3 55