【问题标题】:Better alternative to autonumber primary keys自动编号主键的更好替代方案
【发布时间】:2010-12-30 05:28:41
【问题描述】:

我正在寻找比自动编号数据类型更好的主键,因为它仅限于长整数,当我真的只需要该字段来反映永远不会重复的数字或文本字符串时,不无论从表中添加或删除多少条记录。问题是我不确定如何实现诸如将当前日期和时间转换为十六进制字符串并将其用作可以用作主键的唯一字段。

我是不是太担心空间不足了?

-- 2010 年 3 月 16 日编辑 @ 1237 小时 --

我有一个人,当时我认为是 Access 相关问题的一个很好的参考,他告诉我复制 ID 只是一个项目被复制次数的计数器......因此我没有进一步探索它.在回复数量之后,我已经修改并接受了答案。我想我只是有一个愚蠢的新手 Accesss 开发者时刻。说真的,再次感谢所有回复的人!

【问题讨论】:

  • 自动编号字段很长,有 4 个字节,可以有 2,147,483,647 条记录。然后是负数,这将是另一个 -2,147,483,648 记录如果您担心空间不足,我建议您将数据存储在 Access aka Jet 格式以外的数据系统中。
  • 不清楚您是否在 Access 中编写应用程序。如果是这样,那么您只是在开发过程中添加了问题,正如 Tony Toews 在 cmets downthread 中引用的 Michael Kaplan 文章中所述。您可能对这些感到满意,但我主要认为那些认为他们需要在 Access 应用程序中使用 GUID 而没有外部依赖会导致问题的人大多是在自欺欺人并引入不必要的开发问题。但请注意,我说的是“大部分”而不是“总是”。

标签: ms-access database-design primary-key


【解决方案1】:

GUID。 它们非常独特

http://en.wikipedia.org/wiki/Globally_Unique_Identifier

你没有提到你的编程语言。 C# 类似于

String myKey = Guid.NewGuid().toString();

【讨论】:

  • 在考虑 GUID 之前阅读以下文章。主题:信息:复制和 GUID,好的、坏的和丑陋的 trigeminal.com/usenet/usenet011.asp?1033
  • 如果您将数据库设置为具有文本值并手动输入您的 GUID,则可以解决链接中列出的所有问题。对于第 4 点。没有人想成为一个数字,就像不想成为一堆随机的字母一样。如果我正在制作一个系统,它将能够在不使用主键的情况下找到记录
  • 更改为文本类型会改变索引,而且效率可能较低(GUID 中的字母不是文本,而是十六进制数字)。但我不确定——我从未见过使用 GUID 作为 PK 的理由(尽管我所有的复制数据库都将它们用于复制功能,这完全留给了数据库引擎)。
【解决方案2】:

为什么你认为你会用完空间?也许您没有意识到 64 位整数到底有多大。它允许大约 100 亿条记录。如果您每秒创建 100 条记录,那么five billion years 将耗尽整数。

【讨论】:

  • 访问 Long 类型只有 32 位。
  • 哦!!!!只有 32 位!如果 Jet/ACE 适合作为应用程序的数据存储,那么 Jet/ACE 长整数就足够了。如果第一个条件不满足,那么问题不在于选择自动编号作为 PK。
  • 从技术上讲,Microsoft Access 仅使用 4 个字节来存储一个长整数,因此是原始问题 - 但我得到了一个有效的响应。谢谢。
【解决方案3】:

为什么限制为长整数?当您指定自动编号字段时,您可以告诉它使用 Replication ID 而不是 Long Integer,它将是一个唯一的 128 位值,称为 GUID。

虽然您可以将当前日期和时间用作主键,但原因如下:

当前日期和时间并不像您想象的那么独特。如果您非常快速地制作记录,您最终可能会在时钟滴答之间插入两个,导致两者以相同的时间结束。或者您的计算机时钟可能会向后重置。或者 DST 可能会结束,如果您要存储当地时间,您最终会得到重复的时间。

【讨论】:

  • 我不建议使用 DateTime stamp 作为主键。
  • 确实,Kieran,我的大部分帖子都在解释为什么这不是一个好主意。
  • 编辑后+1。复制 ID 是特定于数据库的,无需将其放入代码中。比我的解决方案更好。
【解决方案4】:

根据约翰的回答,您不太可能用完长整数。但是,如果您更喜欢唯一的字符串,最简单的解决方案是 UUID。它不需要输入,但生成两个相同 UUID 的几率可以忽略不计。

例如,在 Python 中:

import uuid
uuid.uuid4()

大多数语言都有 UUID 函数:http://en.wikipedia.org/wiki/Uuid

【讨论】:

  • 在什么情况下 Jet/ACE 是合适的数据存储,您会用完长整数吗?
【解决方案5】:

一个非常简单的解决方案是使用带有选项“随机”而不是“增量”的自动编号。我在某处读到,由于数字不连续,因此在同时添加来自多个客户端的新记录时,它具有提高并发性的额外好处。

【讨论】:

  • 实际上,添加记录时并没有提高并发性,因为新记录(以及相应的索引值)将存储在新的数据页中。但是对于编辑压缩文件中的现有数据,理论上它会将数据均匀地分布在所有数据页上,这可以提高并发性。但是只有在compact之后才能得到完美的结果,而且它只适用于编辑现有记录,而不适用于添加记录。
  • @David,感谢您的解释。现在我想我记得我在你关于 SO 的一篇文章中看到了这些信息。有趣......并且记住了;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2011-08-22
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多