两种表结构的区别

2024-04-14

我对这两种结构很困惑。这两个表各有什么优缺点? 哪一个更好,为什么?

TABLE1


反模式?

在常见情况下,第二个表是反模式在数据库设计的背景下。而且,更重要的是,它有特定的名称:实体-属性-值(EAV)。在某些情况下,使用这种设计是合理的,但这种情况很少见——即使在这种情况下,也是可以避免的。


为什么 EAV 不好

数据完整性支持

尽管事实上这样的结构似乎更“灵活”或“先进”,但这种设计也有弱点。

  • 无法设置强制属性。您不能强制某些属性,因为属性现在存储为一行 - 并且属性未设置的唯一标志 - 是表中不存在相应的行。 SQL 不允许您本地构建此类约束 - 因此,您必须在应用程序中检查这一点 - 是的,每次查询你的表
  • 混合数据类型。您将无法使用 SQL 标准数据类型。因为您的值列必须是其中所有存储值的“超类型”。这意味着 - 通常您必须将所有数据存储为原始字符串。然后您将看到像处理字符串一样处理日期、每次转换数据类型、检查数据完整性等等是多么痛苦。
  • 无法强制执行引用完整性。在正常情况下,您可以使用外键来限制您的值,这些值在父表中定义。但在这种情况下并非如此 - 这是因为引用完整性应用于表中的每一行,但不适用于行值。所以 - 你会失去这个优势 - 这是基本的之一关系数据库
  • 无法设置属性名称。这意味着 - 您无法正确限制数据库级别的属性名称。例如,你会写"customer_name"作为第一种情况下的属性名称 - 另一个开发人员会忘记这一点并使用"name_of_customer"。而且..没关系,数据库会通过这个测试,并且您将花费数小时来调试此案例。

行重建

此外,在常见情况下,行重建会很糟糕。例如,如果您有 5 个属性 - 那将是 5 个自表JOIN-s。对于乍一看如此简单的情况来说太糟糕了。所以我什至不想想象你将如何维持 20 个属性。


能有道理吗?

我的观点是——不。在 RDBMS 中总会有办法避免这种情况。这太糟糕了。如果打算使用 EAV,那么最好的选择可能是非关系型数据库。

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

两种表结构的区别 的相关文章

  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字
  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • 按原样将 SQL 保存到 YAML

    我想以我自己的格式将 SQL 保存到 YAML 文件 如下所示 1 sql SELECT DISTINCT p id product p price AS price sp reduction AS discount FROM 我使用 YA
  • Postgresql 的 SQL_NO_CACHE?

    MySQL 关键字是否有等效的 postgresqlSQL NO CACHE 或 SQL Serverdbcc drop clean buffers 即您可以简单地将其包含在 SQL 语句中或作为脚本的一部分吗 UPDATE 这个问题 查看
  • 在 azure Devops 管道中部署 SQL 时遇到错误

    我在 azure Devops 的发布管道中使用 sql DACPAC 类型的部署 但出现以下错误 我对 SQL 不了解 有什么建议吗 Publishing to database database name on server Serve
  • SQL 按计数排序

    如果我有一个表和这样的数据 ID Name Group 1 Apple A 2 Boy A 3 Cat B 4 Dog C 5 Elep C 6 Fish C 我希望根据 Group 的总和从小到大进行排序 例如 A 2条记录 B 1条记录
  • 我应该如何审核 MySQL 表中的更改(使用 MySQL 4)?

    我被要求审核 MySQL 表中的任何 所有更改 有谁知道有什么工具可以帮助我做到这一点 还是我需要编写自己的解决方案 如果我编写自己的审计 我最初的想法是制作一个单独的表并在 PHP 代码中构建一系列更改 类似 fieldname1 gt
  • 如何从 MySQL 中的布尔类型返回不同的字符串?

    如果我在 MySql 中将一列设置为布尔值 则查询将返回以下值 0 or 1 是否可以做这样的事情 SELECT bool value AS yes OR no 我的意思是 根据真假返回两个不同的字符串 SELECT CASE WHEN b
  • 优化 LATERAL join 中的慢速聚合

    在我的 PostgreSQL 9 6 2 数据库中 我有一个查询 该查询根据一些股票数据构建计算字段表 它为表中的每一行计算 1 到 10 年的移动平均窗口 并将其用于周期性调整 具体来说 CAPE CAPB CAPC CAPS 和 CAP
  • 使用转义换行符和回车符取消转义字符串

    我正在尝试编写一个 PLPGSQL 函数来混淆 审查 编辑文本 Obfuscate a body of text by replacing lowercase letters and numbers with symbols CREATE
  • SQL Server 大小写/排序规则问题

    今天我在客户数据库中遇到了一个奇怪的情况 SQL Server 2005 数据库排序规则不区分大小写 因此我可以使用任何大小写编写 SQL 查询 没有任何问题 除了一个 一张特定表中的一个特定列称为 DeadZone 如果我这样查询 从表名
  • 与 SQL 中的 IN 运算符相反

    我怎么能做相反的事情 换句话说 选择所有姓氏不是 Hansen 或 Pettersen 的人 WHERE lastname NOT IN Hansen Pettersen 请参阅 IN 和 NOT IN 运算符 部分SQLite 所理解的
  • 使用 Flot、html、PHP 和 MySql 查询绘制多个图表

    我正在尝试使用 Flot html PHP 和 MySql 查询绘制多个图表 但我陷入了困境 因为我找不到在同一个 html 页面中绘制多个 flot 的方法 为简单起见 在数据库 test db3 映像中包含以下字段 表1 用户名 发送邮
  • 如何编写可以补偿拼写错误数据的 MySQL 搜索?

    有没有什么方法可以编写一个 MySQL 搜索来弥补用户在拼写等方面的错误 作为随机示例 有人可能会输入 电子邮件受保护 cdn cgi l email protection代替 电子邮件受保护 cdn cgi l email protect
  • 唯一约束与唯一索引?

    之间有区别吗 CREATE TABLE p product no integer name text UNIQUE price numeric and CREATE TABLE p product no integer name text
  • 重置 MySQL root 密码不起作用

    我花了很多时间阅读并尝试了数十种重置 root 密码的方法 但我一无所获 我发现 并尝试过 的最完整的说明如下 顺便说一句 我在 Win7 32 位上运行 MySQL 5 5 我创建了一个文件 c mysqlinit txt 其中包含两行
  • VBScript:从 Scripting.Dictionary 中对项目进行排序

    我有下面的代码 它获取这样的数据 姓名 1 姓名 4 姓名 2 姓名 3 并像这样列出 是一个复选框 姓名 1 姓名 4 姓名 2 姓名 3
  • nvarchar 值“3001822585”的转换溢出了 int 列

    我使用以下方法将 Excel 文件导入到 SQL Server Excel 文件将所有值作为字符串 我可以导入文件 除了Barcode SalePrice and Price2 我收到错误 nvarchar 值 3001822585 条形码
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 最近邻居的 Postgis SQL

    我正在尝试计算最近的邻居 为此 我需要传递一个参数来限制与邻居的最大距离 例如 半径1000米内最近的邻居是哪些 我做了以下事情 我用数据创建了表 id name latitude longitude 之后 我执行了以下查询 SELECT

随机推荐

  • 在javascript中获取元素的xpath

    我正在使用 javascript 进行开发 我需要获取单击的元素的 xpath 我知道为了获得 id 我们可以这样做 element onclick function event var target id event target id
  • 为什么 schema_translate_map 不更改架构?

    我正在尝试使用schema translate map更改架构 Base declarative base class DataAccessLayer def init self conn string mysql mysqlconnect
  • 实体框架 7 SaveChanges

    有没有办法注册一个回调 该回调将在 EF7 中的模型保存到数据库之前调用 我想要做的是设置所有模型上的 ModifiedBy 和 ModifiedDate 属性 我不太热衷于在每次保存之前手动执行此操作 因此我正在寻找一些更通用和自动的方法
  • 为什么https只能用于登录?

    性能是唯一的问题吗 不能在整个用户会话期间使用 https 连接吗 显然重定向发生的情况较少 我发现这个相关问题http 与 https 性能对比 https stackoverflow com questions 149274 http
  • SHTML 的目的和独特性是什么?

    最近 当我看到一个带有 shtml 扩展名的网站时 我开始了解 SHTML SHTML 的目的是什么 它与 HTML 和 DHTML 有何不同 SHTML 是一种文件扩展名 可让 Web 服务器知道应使用服务器端包含 SSI 来处理该文件
  • 我可以使用 adb shell 向我的应用程序发送命令吗

    我想找到一种方法来创建可以使用 adb shell 或类似命令发送到我的应用程序的命令 这样我就可以对程序进行一些小的更改 而不必每次更改任何内容时都重新加载应用程序 有没有办法打开 adb shell 并向正在运行的应用程序发送命令 如果
  • WCF回调接口-谁关闭通道

    我在关闭回调 双工通信通道时遇到问题 疑问 这是我的原型 WCF 接口 ServiceContract CallbackContract typeof IMyInterfaceCallback public interface IMyInt
  • 如何使用 rhino 导入其他 javascript 文件

    我一生都无法弄清楚如何在Rhino下的javascript中导入javascript文件 基本上 我想做的就是导入 some file js 并能够使用其中范围内的内容 我一直在尝试弄乱 Context currentContext com
  • Egit - 创建分支时正确设置远程跟踪

    当我使用 EGit 从远程分支创建新分支时 我得到了错误的远程跟踪设置 我从远程分支 refs heads master 创建本地分支 feature1 并立即推送到上游 在我的 git config 文件中配置以下远程跟踪 branch
  • 如何重置对模拟类方法的期望?

    抱歉 如果这很简单 我对 ruby 和 rspec 都是新手 似乎 rspec 是一个非常 晦涩 的世界 特别是来自 net 背景时 在我的 规范 中 我有 before each do expect File to receive exi
  • 将包含无效字符的嵌套字段从 Spark 2 导出到 Parquet [重复]

    这个问题在这里已经有答案了 我正在尝试使用 Spark 2 0 2 将 JSON 文件转换为镶木地板 JSON 文件来自外部源 因此架构在到达之前无法更改 该文件包含属性映射 在我收到文件之前 属性名称是未知的 属性名称包含不能在 parq
  • 树视图虚拟化

    我们正在尝试找到一种虚拟化的好方法TreeView 数据并不是真正的问题 因为它非常轻 每个项目大约 16 字节 问题是我们可能有数以万计的数据 尽管实际数据只占用 160 kb 内存 但树视图项目确实使用更多的内存 我们现在已经尝试使用
  • 如果 Address 嵌套在 User 中,为什么我必须保留这两个对象?

    我想更好地熟悉 JPA 所以我创建了一个非常简单的项目 我有一个用户类和一个地址类 看来我必须坚持两者 即使我将地址添加到我的用户类中 User import javax persistence import java util HashS
  • 严重:Web 应用程序 [/restapp] 中的 Servlet [Jersey Web Application] 引发了 load() 异常

    这是我的 REST API 项目 我不知道这个错误是什么 我正在尝试从两天开始解决这个错误 现在我已经筋疲力尽了 有人可以帮助我吗 网页正在加载 但控制台中显示此错误 SEVERE Servlet Jersey Web Applicatio
  • Bazaar 上的 SSH 权限被拒绝

    我是芭莎的新手 我正在尝试设置我的 SSH 密钥 但我总是收到 没有权限 以下是我所做的事情 打开 PuTTYgen 点击 生成 围绕鼠标指针移动 添加密码 密码 点击 保存公钥 保存公钥 点击 保存私钥 保存私钥 Private Key
  • 将案例类转换为另一个递归结构的相同案例类

    我正在尝试使用 Shapeless 来转换案例类 如下所示 case class A int Int str String case class B a A str String case class AnotherA int Int st
  • ffmpeg流rc缓冲区下溢

    目前我正在使用开源工具 ffmpeg ffserver 建立一个屏幕共享平台 分享之初一切都很好 大约 1 1 2 分钟后 我在输出中得到以下异常 flv 0x3a47aa0 rc buffer underflow flv 0x3a47aa
  • 自定义模块未显示在应用程序列表中

    我正在尝试将模块从 odoo 8 安装到 odoo 9 我刚刚将整个文件夹复制到addonsodoo 9 中的文件夹并希望我能以某种方式installodoo 9 中的模块 但它没有显示在要安装的应用程序列表中 odoo 的结构是否有任何变
  • 如何在 swi-prolog 的 prolog 文件中运行 prolog 查询?

    如果我有一个定义规则的 prolog 文件 并在 Windows 中的 prolog 终端中打开它 它会加载事实 然而 然后它显示 提示我手动输入一些内容 如何将代码添加到文件中 以便它实际上会评估这些特定的语句 就像我输入它们一样 像这样
  • 两种表结构的区别

    我对这两种结构很困惑 这两个表各有什么优缺点 哪一个更好 为什么 TABLE1 反模式 在常见情况下 第二个表是反模式在数据库设计的背景下 而且 更重要的是 它有特定的名称 实体 属性 值 EAV 在某些情况下 使用这种设计是合理的 但这种