当前位置: 首页 > 面试题库 >

使用多列主键的利弊是什么?

卢鸿彩
2023-03-14
问题内容

我想看一个例子:

  • 什么时候合适
  • 当这不合适时

是否有一段时间数据库的选择会与上述示例有所不同?


问题答案:

这似乎是关于 代理 键的问题, 代理 键始终是自动递增的数字或GUID,因此是单列,而 自然
键则通常需要多个信息才能真正唯一。如果您能够拥有仅一列的自然键,那么无论如何,这一点显然是没有意义的。

有些人会坚持只使用其中之一。花足够的时间使用生产数据库,您将了解到没有任何上下文无关的最佳实践。

其中一些答案使用SQL Server术语,但是这些概念通常适用于所有DBMS产品:

使用单列代理键的原因:

  • 聚集索引。 当数据库只能附加聚簇索引时,聚簇索引总是表现最佳-否则,数据库必须进行页面拆分。请注意,这仅在键为 顺序 键(即自动递增顺序或顺序GUID)时适用。任意GUID的性能可能会更差。

  • 关系。 如果你的关键是3,4,5列长,包括性格类型和其他非压缩数据,你会浪费 巨大 的空间量,然后,如果你要建立外键关系在其他20桌此键降低性能。

  • 独特性 有时候,你并不 拥有 真实自然的关键。也许您的表是某种日志,并且您有可能同时获取两个相同的事件。也许您的真实键就像是物化路径,只能在已插入行 之后 才能确定。无论哪种方式,您始终希望聚簇索引和/或主键是唯一的,因此,如果没有其他真正唯一的信息,则别无选择,只能使用代理键。

  • 兼容性。 大多数人将永远不必处理此问题,但是如果自然键包含类似的内容hierarchyid,则某些系统甚至可能无法读取它。在这种情况下, 必须 再次创建一个简单的自动生成的代理密钥,以供这些应用程序使用。即使您在自然键中没有任何“怪异”数据,某些数据库库在处理多列主键时也会遇到很多麻烦,尽管这个问题很快就消失了。

使用多列自然键的原因

  • 贮存。 许多使用数据库的人从来没有使用过足够大的数据库,而不必关心这个因素。但是,当一个表具有数十亿或数万亿的行时,您将想要在该表中保留可能的绝对最小数据量。

  • 复制。 是的,您可以使用GUID或顺序GUID。但是GUID有其自身的权衡,如果出于某种原因您不能使用GUID,则多列自然键是复制方案的更好选择,因为它 本质上全局唯一的 -就是说,您不需要特殊的算法就可以使其具有唯一性, 根据定义 它是唯一 。这使得对分布式体系结构的推理变得非常容易。

  • 插入/更新性能 。代理键不是免费的。如果您有一组唯一 经常被查询的列,因此您需要在这些列上创建覆盖索引;索引最终几乎与表一样大,这浪费了空间, 并且 每次进行任何修改时都需要更新第二个索引。如果表上可能只有 一个 索引(聚集索引),则应该这样做!

这就是马上想到的事情。如果我突然想起其他任何事情,我会进行更新。



 类似资料:
  • 我正在读这篇文章: http://www.codeproject.com/articles/479635/UnderstandPlusImplementingPlusDecoratorp 我正在考虑在一个学校项目中实施这种模式。这不是一个要求,所以我可以半屁股。但是,我只是认为这将是一个扩大我的知识和专长的好机会。 这是我的问题:这似乎不是一个好的模式,这是为什么: 每当“披萨店”在他们的菜单上添

  • 问题内容: 我在写简单的太阳系模拟器。这是我的第一个libgdx项目。我在主菜单中使用舞台和演员,非常方便,尤其是触摸事件处理。但是…看这些例子,我发现没有人在实际的游戏逻辑中使用演员。如果我应该使用actor作为行星类的父母,或者只是写我自己的类,我会徘徊。行星将不可触摸,它们只能在帧之间移动,因此动作MoveBy的第三个参数必须是帧之间的时间。那就是缺点。使用Actor有哪些优点? 问题答案:

  • 问题内容: 我是数据库编程的新手,我想知道索引的负面影响是什么?据我了解,索引加快了必须在数据库中搜索特定值(例如SELECT)的操作。 考虑以下示例: 对于table (在column上具有索引),操作: 作为索引的结果将更快。 我的问题是:使用索引有什么弊端?如果索引只是给我们带来好处(提高性能),为什么不将它们设置为默认值呢? 问题答案: 好吧,您可能可以填写有关索引的书,但总之,在创建索引

  • 本文向大家介绍ICONFONT使用及其利与弊?相关面试题,主要包含被问及ICONFONT使用及其利与弊?时的应答技巧和注意事项,需要的朋友参考一下 把一些零散的icon做成字体。我们调用文字的时候,渲染出来的就是icon图像,这样的显示就是iconfont(字体图标) 好处: iconfont图像放大后,不会失真。 iconfont节省流量 iconfont在颜色变幻方面很简单 缺点: iconf

  • 问题内容: 该表具有以下字段: 假设我有上表。我想获取昨天的记录,并通过将金额打印为美分来生成报告。 一种方法是在我的Java应用程序中执行计算并执行一个简单的查询 然后遍历记录,并在我的Java应用程序中将金额转换为美分并生成报告 另一种方法类似于在sql查询本身中执行计算: 然后遍历记录并生成报告 一种方式是,我所有的处理都在Java应用程序中完成,并且触发了一个简单的查询。在其他情况下,所有

  • 本文向大家介绍什么是主键?什么是外键?相关面试题,主要包含被问及什么是主键?什么是外键?时的应答技巧和注意事项,需要的朋友参考一下 主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。