为什么人们会考虑使用代理键而不是自然键和 ON UPDATE CASCADE ?

2024-02-21

免责声明:这与其他主题不是同一个问题。


使用自然键时我们面临的缺点之一是,如果业务逻辑发生变化并且我们需要更改一个键,则需要将这一更改传播到所有链接表。

然而,使用一个关于级联更新 https://stackoverflow.com/questions/1481476/when-to-use-on-update-cascade当我们更改键值时,我们可以让 DBMS 为我们传播更改。

我不明白的是:这种方法有什么缺点?有没有什么情况使用ON UPDATE CASCADE对数据库有风险吗?

因为如果不是,那么如果在某种情况下,使用代理键的唯一原因是更改业务自然键更容易,那么ON UPDATE CASCADE应该使用而不是将所有表转换为代理键。


代孕妈妈的优点..

  1. 如果您使用 REST,那么它需要资源标识符的概念。使用资源的一部分作为资源标识符可能很麻烦。在这种情况下,代理键并不是真正的代理,因为它成为现实世界的资源标识符,但这就是使用代理键模式的原因之一。

  2. 许多 ORM 工具通过代理更容易管理。无论好坏,OOP 要求身份概念与价值保持分离。在很多方面,这与第 1 点类似。

  3. 如果更改关键属性,您只需更改一张表即可。另一方面,如果您希望保持引用完整性,代理不能将自然复合键转换为简单键。例如,文档(UserId,FolderId)引用文件夹(UserId,Id)可以防止用户将其文档放入其他人的文件夹中,而文档(FolderId)引用文件夹(Id)则不能将其放入其他人的文件夹中。但使用代理至少限制了对结构决策的强制性彻底改变,而不仅仅是某人在几个候选键中进行选择。

我不会列出自然键的优点,因为我认为它们是显而易见的。少即是多。替代品是需要论证的概念。

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

为什么人们会考虑使用代理键而不是自然键和 ON UPDATE CASCADE ? 的相关文章

  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • Capistrano 部署擦除数据库?

    我已成功使用 Capistrano 将我的应用程序部署到生产环境 但我不明白如何处理我的数据库 我正在使用颠覆和乘客 当我运行 cap 部署时 新部署会重新启动一切 它会清除添加到数据库中的数据 显然 必须有一个解决方案 但我很惊讶没有在网
  • mongodb 正在运行吗?

    我已经在我的 Unix 服务器上安装了 Mongodb 和 PHP 驱动程序 我的问题是如何判断 Mongodb 是否正在运行 是否有一个简单的命令行查询来检查状态 如果我从外壳程序启动一次 如果我退出外壳程序 它会继续运行 情况似乎并非如
  • 如何为 MySQL 和 Postgres 编写不区分大小写的查询?

    我在本地运行 MySQL 数据库进行开发 但部署到使用 Postgres 的 Heroku Heroku 处理几乎所有事情 但我不区分大小写的 Like 语句变得区分大小写 我可以使用 iLike 语句 但我的本地 MySQL 数据库无法处
  • CAP 定理 - 可用性和分区容错性

    当我尝试理解CAP中的 可用性 A 和 分区容错性 P 时 我发现很难理解各种文章的解释 我感觉A和P可以在一起 我知道事实并非如此 这就是为什么我无法理解 简单解释一下 A和P是什么以及它们之间的区别 一致性意味着整个集群中的数据是相同的
  • ER_ACCESS_DENIED_ERROR:用户 ''@'localhost' 的访问被拒绝(使用密码:NO)

    我有这个问题 我已经研究过但无法解决它 我想它与数据库权限有关 但我无法修复它 if error throw error Error ER ACCESS DENIED ERROR Access denied for user localho
  • SQLite同时读写

    我读过很多主题 但无法找到问题的答案 是否可以同时读写 我有后台线程更新一些数据 UI 需要存储在数据库中的一小部分数据 所以在UI线程中执行SELECT操作 但当更新正在进行时它会阻塞 结果 UI 冻结了几秒钟 有人在写入时成功从数据库读
  • 需要有关使用 PHP 在 mysql 数据库中插入逗号分隔数据的帮助

    数据库表中已有的演示数据 INSERT INTO csvtbl ID SKU Product Name Model Make Year From Year To VALUES 1 C2AZ 3B584 AR Power Steering P
  • 内存高效的大型数据集流式传输到 S3

    我正在尝试使用 SQL alchemy 复制 S3 大型数据集 大于 RAM 我的限制是 我需要使用 sqlalchemy 我需要将内存压力保持在最低水平 我不想使用本地 filsystem 作为中间步骤将数据发送到 s3 我只想通过管道将
  • 如果我的应用程序安装在 SD 卡上,私人数据也在那里吗?

    我假设应用程序的私有数据 例如 SharedPreferences 和 SQLite 数据库 位于手机的内部存储而不是 SD 卡上 即使应用程序本身安装在 SD 卡上 我在任何地方都找不到对此的简单明确的确认 有人可以确认一下吗 是的 私有
  • Android 预填充数据库 [重复]

    这个问题在这里已经有答案了 我正在开发一个 Android 应用程序 需要在该应用程序的数据库中填充多个条目 一个表 包含 1000 10000 行 然后用户才能使用该应用程序 我浏览了一些教程 但不确定执行此操作的最佳方法 我是否应该在每
  • Laravel 使用数据库自​​动完成文本字段

    我正在尝试制作如下所示的自动完成表单 但该表单没有显示建议 因为我的数据库查询没问题 形成科尔 控制器方法代码 Routes 当我搜索链接时 我得到如下查询结果 显示结果 id 1 value 苏拉夫霍森 id 2 value 苏拉夫霍森
  • 不能为实体类型指定过滤表达式。过滤器只能应用于层次结构中的根实体类型

    我在添加新迁移时遇到此错误 无法为实体类型 Babysitter 指定筛选表达式 e gt Not e IsDeleted 过滤器只能应用于层次结构中的根实体类型 我正在做的是 我有 2 个类 Babysitter 和 Parent 它们都
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • 如何使用索引更改表的列?

    我想将带有某些索引的表中 a 列的列大小从 varchar 200 更改为 varchar 8000 我应该如何进行 既然是VARCHAR你正在增加尺寸 然后简单地ALTER TABLE ALTER COLUMN https learn m
  • 用户离开时如何正确插入时间( user_left 和 user_joined 具有相同的值)

    在这段代码中 我想获取用户加入和离开的时间并将其存储到数据库中 如果我在 连接 表和 左 表中获得相同的值 会发生什么情况 如何修复它以便它存储不同的值 Schema create user info function Blueprint
  • 存储和检索多个头像图像尺寸

    我正在建立一个论坛类型的网站 用户将有一个头像 主页将有一个小版本的头像 而单页面将有一个大版本的头像 因此 为了带宽的考虑 我将采用不同的大小 example png example thumb png 不同尺寸的首选存储和检索方法是什么
  • 为什么使用参数化查询将数据插入表比将值附加到查询字符串更快?

    为什么使用参数化查询向表中插入数据 string queryString insert into product id name values id name 比将值附加到查询字符串更快 string queryString insert
  • 我应该安装哪个驱动程序才能使用 powershell 运行 mysqlcommand?

    我安装了 mysql 连接器 ODBC 5 1 8 来运行 sqlcommand 但出现此错误 Cannot find type MySql Data MySqlClient MySqlConnection make sure the as
  • 如何检测数据库类型?

    我需要确保我连接的数据库是 MySQL 而不是 PostgreSQL 或 Microsoft SQL Server 我怎样才能知道正在使用哪种类型的数据库 第一个提示可能是如果您尝试使用 mySQL 数据库驱动程序连接到 PostgreSQ

随机推荐