EF 的代理键与自然键

2023-11-30

我和我的同事正在尝试确定哪种方法是为两个数据库表设计架构和键的更好方法。一种是很少改变的查找表。它有大约 700 行。另一个表引用查找表。随着时间的推移,该表将有数千行。在设计 B 中,查找表的主键由 3 个 varchar 组成。另一个表的主键由相同的 3 个 varchar 组成,并添加了两个日期字段。在设计 A 中,3 个 varchar 被替换为代理键。这 3 个 varchar 具有唯一约束 (UC)。

哪个设计更好?我的同事说,如果我们有代理键,那么当我们需要向用户显示数据时,在表上进行联接将会变得非常慢。此外,拥有一个仅用于使行唯一的键是浪费的。我的观点是,连接速度很快,并且存储 3 个 varchar 的额外数据是浪费的,因为它会在两个表中重复这些数据。

我们在 T-SQL Server 2008 中的带有 EF 5 的 WPF 桌面应用程序中使用它。代理键还是自然键?附图显示了两种不同的设计。

enter image description here


表上只有几千行,我认为您不会注意到任何差异。即使一个表有数百万行,另一个表也如你所说只有 700 行。 SQL-Server 几乎是为高效地进行连接而设计的,所以当你的同事声称连接到一个表时,他是不正确的。太小的(700行)表会影响效率。

设计 A 比 B 更好的一方面是较大的表 (PriceIndex) 会更窄,因此用于连接的索引也会更窄。 4 个字节而不是 90 个字节可以大大提高性能。您可能需要的所有其他包含代理键的复合索引在设计 A 中也会比在设计 B 中更窄。

设计 B 比 A 更高效的情况是涉及以下查询:GROUP BY两个表中的列。例如,如果您有一个查询GROUP BY Price, HubCode,在设计 B 中,您可以在这两列上添加复合索引,而在设计 A 中,这些列将位于单独的表中,并且您不能拥有包含来自 2 个表的列的索引。

另一个方面是是否还有其他表以这些列作为主键,比如说您是否有另一个表(HubCode)作为PK和另一个(HubCode, TimeFrame)另一个与(IndexCode, HubCode)也许还有另一个(IndexCode, HubCode, TimeFrame, StartDate, EndDate, CustomerID)。使用设计 B(所有表都具有自然键),涉及多个表的联接的多个复杂查询可以更加高效,因为可以消除一些中间联接。使用设计 A(代理键),无法跳过中间连接,并且当(中间)表很大时,查找成本可能会变得相当大。

最后,没有什么比测试您的数据、您期望表增长的大小以及您期望运行的查询类型更重要的了。

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

EF 的代理键与自然键 的相关文章

随机推荐

  • 行结束符区别适用于 html 表单吗?

    我知道文件使用的行结尾因操作系统而异 我想知道 如果用户将文本粘贴到 http 表单输入 例如文本区域 中 发送的行结束字符是否以相同的方式取决于操作系统 不 浏览器应该规范行结尾
  • 如何将 CSV 数据文件加载到 R 中以与 quantmod 一起使用

    我是 R 新手 刚刚开始使用它 我目前正在尝试 quantmod 包 quantmod 包似乎可以完成我想做的大部分事情 但是 我不想使用 getSymbols 函数将数据获取到 R 中 相反 我想使用我自己的数据 存储为本地磁盘上的 cs
  • 当滚动窗格包裹文本窗格时,如何防止 JScrollPane 箭头键处理移动插入符

    我有以下要求 我需要一个可滚动的 JTextPane 用户可以在此文本窗格中键入内容 或者可以将用户未键入的文本插入其中 想想类似于 IM 窗口的东西 尽管窗口必须可滚动以允许用户查看先前键入的文本 但插入符号永远不应该从文本末尾的位置移动
  • 解析非预定义参数

    有没有可以在Python中解析sys argv中随机键值对的库 例如 python run py v1 k1 v2 k2 v3 k3 应该返回给我一个像 v1 gt k1 v2 gt k2 v3 gt k3 这样的字典 在编译时我不知道那些
  • 在 IE 中使用 => 时出现语法错误 [重复]

    这个问题在这里已经有答案了 我有以下 JavaScript 代码行 var res Object keys packages filter e gt packages e true 上面的代码在除 IE 之外的所有其他浏览器中都可以正常运行
  • Nifi:如何编写自定义处理器

    我想写nifi处理器 可以从hdfs目录读取xml文件 然后将其数据提取到flowfile属性中 如果有两个 nifi 处理器可以获取该文件并读取数据或向其中写入内容的情况我怎样才能进行文件锁定这样一次只有一个处理器可以使用它 您能给我推荐
  • 在 Angular 2 中使用 ComponentResolver 加载组件时注入不同的提供程序

    我们可以在动态加载组件时注入不同的提供程序吗 我的组件 Component moduleId module id selector my component template div my component div providers M
  • Wikidata+SPARQL:根据股票代码查找公司

    我正在尝试使用 sparql 根据股票代码查找公司 此查询将列出企业及其股票代码 基本查询 SELECT DISTINCT id idLabel ticker WHERE id wdt P31 wdt P279 wd Q4830453 id
  • 如何防止ViewFlipper循环

    我正在开发一个应用程序 其中我使用ViewFlipper与定制OnTouch执行 在里面ViewFlipper 我有大约 20 张图像供用户翻阅 这工作正常 但如果我在该系列中的第 20 个图像处翻转屏幕 它会返回到第一个图像 我想防止Vi
  • AES 姜饼

    This是我的 AES 代码 在 Gingerbread 下 在 2 2 上加密数据然后尝试在 2 3 上解密后出现以下错误 Caused by javax crypto BadPaddingException pad block corr
  • VBA 使用循环引用文本框或标签

    我正在尝试替换以下内容 txt1 Text txt2 Text txt3 Text txt4 text continues for quite awhile With Dim cCont As Control For Each cCont
  • 登录时未通过凭据提供程序加载 KSP(密钥存储提供程序)

    我正在创建一个 Windows 凭据提供程序 以使用此处所述的证书登录到 Windows 域article 这意味着创建一个自定义 KSP 在创建身份验证包时将由 LsaLogonUser 调用 我设法创建自定义 KSP 并在直接调用 Ls
  • JQuery在渲染后搜索dom元素,并用其对应的值替换键

    我正在尝试在我正在开发的网络应用程序上应用我自己的本地化方法 知道我正在使用 JQuery 2 2 0 没有任何其他框架或第三方 我需要在纯 html 代码中编写一些表达式 ex 1 span lang details span ex 2
  • 如何在打字稿中选择性地从一个部分分配到另一个部分

    在下面的 TypeScript 代码片段中 我需要将一个对象分配给另一个对象 其中两个对象都在Partial
  • 当客户向您提供他们的公共证书时进行相互身份验证

    通常 2 路 ssl 又名相互身份验证包括生成服务器 ca 密钥和证书等 然后客户端生成一辆车 将其交给您 您签署他们的 csr 并向他们提供客户端证书 然而 我遇到过一种情况 客户要求我通过交换彼此的 x509 公共证书来实现 相互身份验
  • 使用 Apache POI 创建 .xlsx 文件时出现 java.lang.NoClassDefFoundError

    我正在尝试使用 Apache POI 创建 xlsx 文件 这是我的代码 FileOutputStream outputStream1 null XSSFWorkbook workbook new XSSFWorkbook XSSFShee
  • Cython 预编译器决策[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在寻找一种在 cython 文件中添加预编译器逻辑的解决方案 我已经为 C 中的硬件设备 API 编写了一个 cython 包装器 这是一个 cython 项目 通常使用 MSVC
  • 如何根据点是否在多边形内来标记点

    我有新西兰各地鸟类观测的经度和纬度 存储在Count df 在变量下count longitude and latitude 然而 其中一些出现在近海 海洋中 这是一个公民科学数据集 我想根据这些点是否超出中给出的信息来对它们进行子集化ma
  • 在 WooCommerce 中阻止在没有送货方式的情况下访问结账

    我正在尝试删除继续结帐按钮并限制对结帐页面的访问 直到客户填写购物篮页面上的 计算运费 选项 我创建了一种仅限于多个邮政编码 邮政编码的本地运输方法 然后我将其添加到我的functions php 文件中 function disable
  • EF 的代理键与自然键

    我和我的同事正在尝试确定哪种方法是为两个数据库表设计架构和键的更好方法 一种是很少改变的查找表 它有大约 700 行 另一个表引用查找表 随着时间的推移 该表将有数千行 在设计 B 中 查找表的主键由 3 个 varchar 组成 另一个表