jam*_*ieb 55 sql database-design
我试图找出决定是否添加自动递增整数作为表的主键的"最佳实践".
假设我有一个包含化学元素数据的表格.每个元素的原子序数是唯一的,永远不会改变.因此,不是为每列使用自动递增整数,而是使用原子序数可能更有意义,对吗?
如果我有一张书桌,那也是如此吗?我应该使用ISBN还是主键的自动递增整数?或者包含每个人的SSN的员工表?
Jay*_*Jay 10
这是一个备受争议的问题,双方都有很多情绪.
在我看来,如果有一个好的,可用的自然键 - 比如ISBN - 我会用它.无论如何,我打算将它存储在数据库中.是的,自然键通常大于整数自动增量键,但我认为这个问题过于夸张.磁盘空间今天很便宜.我更担心它需要更长的时间来处理.如果你在谈论一个80字节的文本字段作为主键,我会说不.但是,如果您考虑使用10字节的ISBN而不是8字节的大整数,我无法想象这会带来很多性能损失.
有时,自然键具有性能优势.例如,假设我想找到已售出的给定书籍的副本数量.我不关心Book主记录中的任何数据.如果主键是ISBN,我可以简单地写一下"select count(*)from sale where isbn ='143573338X'".如果我使用自动增量密钥,我将不得不进行联接以查找isbn,并且查询变得更复杂和更慢,例如"使用(bookid)从书籍加入销售中选择计数(*),其中isbn ='143573338X' ".(我可以向你保证,由于这个特定的ISBN适用于我的书,销售记录的数量非常少,所以加入和阅读一个额外的记录是一个很大的百分比差异!)
自然键的另一个优点是,当您必须处理数据库并查看按键引用此表的记录时,很容易看到它们所引用的记录.
另一方面,如果没有好的,明显的自然键,不要试图拼凑一个疯狂的.我看到人们试图通过将客户名字的前6个字母,他的出生年份和他的邮政编码连接在一起来制作一个自然的密钥,然后祈祷这将是独一无二的.那种愚蠢只会给自己制造麻烦.通常人们最终会接受一个序列号,以确保它是独一无二的,在那一点上,为什么还要费心呢?为什么不直接使用序列号作为键?
你的想法就在那里。
当您正在建模的项目不存在唯一键时,应将自动增量用作唯一键。因此,对于 Elements,您可以使用 Atomic Number 或 Books 使用 ISBN 编号。
但是,如果人们在留言板上发布消息,那么这些消息需要一个唯一的 ID,但不自然包含 ID,因此我们从列表中分配下一个编号。
在可能的情况下使用自然键是有意义的,只需记住将该字段作为主键并确保对其进行索引以提高性能
| 归档时间: |
|
| 查看次数: |
28763 次 |
| 最近记录: |