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

表中主键的最佳做法是什么?

荀学文
2023-03-14
问题内容

在设计表时,我养成了一种习惯,即有一列是唯一的,并且我将其作为主键。这可以通过三种方式来实现,具体取决于需求:

  1. 自动递增的标识整数列。
  2. 唯一标识符(GUID)
  3. 可以用作行标识符列的短字符(x)或整数(或其他相对较小的数字类型)列

数字3将用于较小的查找,大多数是读取的表,这些表可能具有唯一的静态长度字符串代码或数字值,例如年份或其他数字。

在大多数情况下,所有其他表将具有自动递增的整数或唯一标识符主键。

我最近开始使用没有一致的行标识符的数据库,并且主键当前聚集在各个列中。一些例子:

  • 日期时间/字符
  • 日期时间/整数
  • 日期时间/ varchar
  • 字符/ nvarchar / nvarchar

有没有有效的理由呢?对于这些情况,我将始终定义一个标识或唯一标识符列。

此外,还有许多根本没有主键的表。这样做的有效原因是什么(如果有)?

我试图理解为什么表是按原样设计的,这对我来说似乎是一个大麻烦,但是也许有充分的理由。

第三个问题可以帮助我解释答案:如果使用多列组成复合主键,与代理/人工键相比,此方法是否具有特定优势?我主要是在性能,维护,管理等方面进行思考?


问题答案:

我遵循一些规则:

  1. 主键应尽可能小。首选数字类型,因为数字类型以比字符格式更紧凑的格式存储。这是因为大多数主键都将是另一个表中的外键以及在多个索引中使用。键越小,索引越小,将使用的缓存中的页面越少。
  2. 主键永远不应该改变。更新主键始终是不可能的。这是因为它最有可能在多个索引中使用并用作外键。更新单个主键可能会引起更改的连锁反应。
  3. 不要将“您的问题主键”用作逻辑模型主键。例如,护照号,社会保险号或雇员合同号,因为这些“主键”在实际情况下可能会发生变化。

关于代理键与自然键,我参考上面的规则。如果自然键很小并且永远不会更改,则可以将其用作主键。如果自然键很大或可能会更改,则使用代理键。如果没有主键,我仍然会使用代理键,因为经验表明您将始终向表中添加表,并希望您将主键放在适当的位置。



 类似资料:
  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我过去曾经做过Java和JSP编程,但是我是Java Server Faces的新手,并且想知道JSF开发是否有一套最佳实践。 问题答案: 一些提示:了解JS

  • 问题内容: 我有一个处于测试版模式的应用程序。此应用程序的模型具有一些带有显式primary_key的类。因此,Django使用字段并且不会自动创建ID。 我认为这是个坏主意(在django admin中保存对象时,请参见unicode错误),我想回过头来为模型的每个类提供一个ID。 我已经对模型进行了更改(将每个primary_key = True替换为db_index = True),并且我想

  • 问题内容: 在向我显示重复项之前,请注意,我已经在网站上进行搜索,发现了 一些 示例,但并非完全针对我的问题:) 在SQL中创建 友谊 表的最佳方法是什么,但是要确保每行都是唯一的,因为无论它们属于哪一列,相同的UserID和FriendID都不会被允许? 我有这个粗略的例子 并有2个外键,分别来自UserID和FriendID。 不过目前,我可以在用户之间插入 两次 Friendship ,从而

  • 我需要来自不同Kafka主题的消费者消息, < li >我是否应该为每个主题创建不同的消费者实例,然后根据分区数量启动新的处理线程。或者 < li >我应该从单个消费者实例订阅所有主题,并且应该启动不同的处理线程 谢啦

  • 问题内容: 我有这张桌子(500,000行) 我正在考虑通过(在所有网站中显示仅1个月的记录)进行每个查询 同时,我想在where子句中添加 像这样的事情: 该查询现在还可以并且没有索引就可以快速进行,但是在尝试使用它时却变得太慢了,所以我使用了该索引 它的工作和变得很快,现在我想喜欢这个 这是 该查询速度太慢的原因,因为 然后我试图删除旧索引并添加此 它也太慢了 如果我仅使用单一索引怎么办?在c

  • 问题内容: 我已经设计网站已有一段时间了,但是在使用PHP和HTML时我还不确定。像这样用PHP和HTML 编写整个文档是否更好: 或拥有一个类似HTML的文件,只需添加PHP: 似乎比HTML 整洁,尤其是在整个页面中使用大量PHP的情况下,但这样做会丢失HTML的所有格式,即IDE中的颜色等。 问题答案: 对此有不同的意见。我认为有两种好的方法: 使用像Smarty这样的模板引擎,它将代码和表