为什么没有主键的表是一个坏主意?

2024-05-25

我对数据建模非常陌生,根据微软的实体框架,不允许使用没有主键的表,这显然是一个坏主意。我试图找出为什么这是一个坏主意,以及如何修复我的模型,这样我就不会出现这个漏洞。

我当前的模型中有 4 个表:User、City、HelloCity 和 RateCity。它的模型如图所示。这个想法是,许多用户可以访问许多城市,并且一个用户只能对一个城市评价一次,但可以多次向一个城市打招呼。为此,我没有在HelloCity表中进行PK。

关于如何改变它以符合最佳实践的任何见解,以及为什么这一开始就违背最佳实践?


这个回答主要是基于意见/经验,所以我将列出一些我想到的原因。请注意,这并不详尽。

以下是您的一些原因should使用主键 (PK):

  1. 它们使您能够唯一地标识表中的给定行,以确保不存在重复项。
  2. RDBMS 为您强制执行此约束,因此您不必在插入之前编写额外的代码来检查重复项,从而避免全表扫描,这意味着这里的性能更好。
  3. PK 允许您创建外键 (FK),以 RDBMS“感知”它们的方式创建表之间的关系。如果没有 PK/FK,这种关系只存在于程序员的头脑中,引用的表可能有一行“PK”被删除,而另一个带有“FK”的表仍然认为“PK”存在。这很糟糕,这导致了下一点。
  4. 它允许 RDBMS 强制执行完整性约束。是TableA.id引用者TableB.table_a_id? If TableB.table_a_id = 5那么,你就是保证与 吵架id = 5 in TableA。保持数据完整性和一致性,这很好。
  5. 它允许 RDBMS 执行更快的搜索,因为 PK 字段已建立索引,这意味着表不需要具有all在搜索某些内容时检查其行数(例如,在树结构上进行二分搜索)。

在我看来,notPK可能是legal(即 RDBMS 会让你),但它不是moral(即你不应该这样做)。我认为你需要有非常好的/强有力的理由来争论not在数据库表中使用 PK(我仍然认为它们有争议),但根据您当前的经验水平(即您说您是“数据建模新手”),我认为这还不够试图证明缺乏PK是合理的。

还有更多原因,但我希望这足以让您解决这个问题。

就你而言M:M关系走,你需要创建一个新表,称为联想性的表,以及其中的复合 PK,该 PK 是其他 2 个表的 2 个 PK 的组合。

换句话说,如果有一个M:M表之间的关系A and B,然后我们创建一个表C有一个1:M与两个表的关系A and B。 “以图形方式”,它看起来类似于:

+---+ 1  M +---+ M  1 +---+
| A |------| C |------| B |
+---+      +---+      +---+

随着C表PK有点像这样:

+-----+
|  C  |
+-----+
| id  |  <-- C.id = A.id + B.id (i.e. combined/concatenated, not addition!)
+-----+

或者像这样:

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

为什么没有主键的表是一个坏主意? 的相关文章

随机推荐

  • 如何在使用 window.open 时保持当前页面

    我正在射击Window open 命令 这会在另一个选项卡中打开链接页面 我想要的是 当我单击链接时 链接将在新窗口中打开 但应该位于同一页面上 那可能吗 目前我正在这样使用 function AddToDatabase url windo
  • FOSUserBundle 强制用户写入不同的密码

    我有一个使用 FOSUSerBundle 在 Symfony2 0 上运行的应用程序 连接该应用程序的用户每 3 个月必须更改一次密码 密码已就位且正在运行 今天 如果用户每 3 个月写入与前一个密码相同的新密码 则无需验证 他还可以使用该
  • Crypt::OpenPGP Symkey 解密失败:无效的密钥 ID

    我遇到问题在哪里地穴 OpenPGP https metacpan org module Crypt 3a 3aOpenPGP无法解密 GPG 编码的消息 看来我是不是第一个 http www perlmonks org node id 9
  • 有条件地隐藏 Gridview 中的 CommandField 或 ButtonField

    我有一个GridView显示人员记录 我想有条件地显示CommandField or ButtonField基于基础记录的某些属性 这个想法是只允许对特定的人执行命令 做这个的最好方式是什么 我更喜欢声明式解决方案而不是过程式解决方案 首先
  • cookie神秘重现的原因是什么?

    我正在开发一个使用 cookie 来存储会话信息的 Web 应用程序 我已经手动删除了会话 cookie 因为我正在处理代码的另一部分 我不需要登录会话 然而 在页面重新加载几次后 会话 cookie 神秘地重新出现 其中包括我之前出于测试
  • Notepad++,比较插件安装问题

    我有 Notepad 7 5 8 npp 7 5 8 它没有插件管理器 以前的版本曾经有过它 我遵循了这些说明 我从下载的https sourceforge net projects npp compare https sourceforg
  • DB2 vs PostgreSQL vs SQL Server [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人用过这三个数据库吗 你和他们有什么经历 PostgreSQL 对于一个项目来说看起来相当诱人 但我很想了解更多关于它的信息 我们是一家 NE
  • 计算字符串中的单词数

    我需要一些帮助来计算字符串 s 中的单词数 计算字符串 s 中的单词数 单词之间用空格分隔 有溶胶 istringstream iss s string temp int words 0 while iss gt gt temp words
  • ASP.Net MVC 2 - 通过在参数中指示返回操作和控制器来重用控制器/视图

    Problem 在我的应用程序中 我在多个地方为用户提供了一个选择屏幕 即 必须在多个操作中使用相同的选择屏幕 解决方案 我想出了以下解决方案 将返回操作和控制器传递给处理实体选择的操作 Example 假设应用程序中有多个位置 用户必须选
  • System.Web.Cache 和 HTTPContext.Current.Cache 之间的区别

    System Web Cache 和 HTTPContext Current Cache 有什么区别 在什么情况下同时使用两者 System Web Caching Cache 这是 NET 缓存的实现 System Web HttpCon
  • 如何仅隐藏一些未提交的更改?

    我正在对 Git 存储库进行重大更改 并意识到某些更改需要向后移植到错误修复分支 我不想签入我的所有更改master因为它们还没有经过充分的测试和准备 但我确实想提取其中一些更改并将它们提交到错误修复分支 然后按原样返回到 master 我
  • 如何使用 Microsoft Graph API 按分配的计划筛选用户

    我正在尝试下面的请求 按分配计划属性中的 servicePlanId 过滤用户 尝试过滤 电话系统 计划 https graph microsoft com beta users filter assignedPlans any x x s
  • 更新或插入 SQL Server 时忽略错误行

    我的项目必须处理巨大的数据库 在最坏的情况下 它可能是超过8000万行 现在 我有 2 张桌子T1 and T2 我必须从表中复制数据T1到餐桌T2 如果表中的一行T1表中已存在T2 相同主键 然后更新该行其他列的数据T1 to T2 否则
  • 如何使用 vue 观察对象数组中的特定属性

    我正在使用 vue js 2 5 2 我有一个对象数组 我想观察 forms selected 如果它发生变化 则调用一个函数 这是我的尝试 但显然这是不正确的 我尝试将数组放入 for 循环中以观察所选的每个对象的属性 watch for
  • 使用 Google Maps API 旋转 SVG 符号以匹配飞机航向

    我一直在尝试旋转 Google Maps API SVG 飞机符号 以便每次符号移动时都能显示飞机的正确航向 它最初加载时显示正确的标题 我似乎不知道如何将其更新为新标题 我花了两天的时间尝试 但非常失败 我想我可以通过添加来简单地改变它r
  • 是什么导致“线程被中止”异常随机发生并向浏览器显示 HTTP 标头和部分 HTML?

    发生的情况偶尔是随机的 而不是像您期望的那样将 HTML 返回到浏览器 它看起来有点像这样 线程正在中止 HTTP 1 1 200 OK 标题的其余部分 如 HTML 的 1 10 就是这样 他们实际上在浏览器窗口中收到了一堆文本 它不会一
  • 10秒后显示div,10秒后隐藏

    我需要在页面加载后 10 秒内显示一个 div 例如 mybox 使其再保持可见 10 秒 然后以漂亮的滑入 滑出效果隐藏 非常感谢您的任何提示 帮助 请使用以下功能 cycle function cycle myid delay 1000
  • 如何使用 XML 序列化更改 XML 根名称?

    我试图在使用 C 进行 XML 序列化时更改根名称 它始终采用类名称 而不是我试图设置它的名称 using System using System Collections Generic using System Linq using Sy
  • 运行多个 powershell 命令

    我如何运行前导命令 例如set adserversettings当我在 C 中调用 powershell 命令时 现在它返回 0 个结果 这是我正在使用的代码 Command command1 new Command set adserve
  • 为什么没有主键的表是一个坏主意?

    我对数据建模非常陌生 根据微软的实体框架 不允许使用没有主键的表 这显然是一个坏主意 我试图找出为什么这是一个坏主意 以及如何修复我的模型 这样我就不会出现这个漏洞 我当前的模型中有 4 个表 User City HelloCity 和 R