0

我正在为我的一个项目设计一个数据库,在项目中我有许多不同类型的对象。每个对象都可能有评论——它从同一个评论表中提取。

我注意到当两种不同类型的对象具有相同的 id 时,我可能会遇到问题,并且当从评论表中拉出时,它们会互相拉取评论。我可以通过添加一object_type列来解决它,但是在查询等时会更难维护。

在我的整个数据库中拥有唯一行 ID 的最佳方法是什么?

我注意到 Facebook 用一个非常非常大的 ID 编号他们的对象,并且可能通过id mod trillion或其他一些非常大的数字来确定它的类型。虽然这可能有效,但是否有更多选择可以实现相同的目标,或者依赖足够大的数字范围应该没问题?

谢谢!

4

4 回答 4

3

您可以使用 Twitter 为其唯一 ID 使用的东西。

http://engineering.twitter.com/2010/06/announcing-snowflake.html

但是,对于您创建的每个对象,您都必须对该服务进行某种 API 调用。

于 2012-05-12T21:25:16.787 回答
0

object_type为什么不通过将其集成到 id 列来调整您的概念?例如,ID 可以是对象类型、分隔符和列中唯一 ID 的串联。

这种方法可能会更好地扩展,因为整个数据库的唯一 ID 生成器可能会导致性能瓶颈。

于 2012-05-12T21:40:34.447 回答
0

我将表用作对象类,将行用作对象,将列用作对象参数。一切都以类 techname 开头,其中每个对象都有其唯一标识符,该标识符在数据库中是唯一的。对象类被注册为表对象类中的对象,并且每个对象类的参数都链接到它。

于 2015-08-27T20:40:37.317 回答
0

如果您只有一个数据库实例,您可以创建一个新表来分配 ID:

CREATE TABLE id_gen (
  id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL
);

现在您可以轻松地生成新的唯一 ID 并使用它们来存储您的行:

INSERT INTO id_gen () VALUES ();
INSERT INTO foo (id, x) VALUES (LAST_INSERT_ID(), 42);

当然,当你不得不对它进行分片时,你就有点麻烦了。您可以留出一个管理此表的数据库实例,但是您会遇到所有写入的单点故障和严重的 I/O 瓶颈(如果您必须处理地理位置不同的数据中心,这种情况只会变得更糟)。

Instagram 有一篇关于他们的 ID 生成方案的精彩博客文章,它利用 PostgreSQL 的强大功能和一些关于其特定应用程序的知识来跨分片生成唯一 ID。

另一种方法是使用 UUID,它极不可能出现冲突。您可以“免费”获得全球唯一性,但需要进行一些权衡:

  • 尺寸稍大:一个 BIGINT 是 8 个字节,而一个 UUID 是 16 个字节;
  • 索引的痛苦:对于未排序的键,INSERT 速度较慢。(UUID 实际上比 hashes 更可取,因为它们包含一个按时间戳排序的段。)

另一种方法(前面提到过)是使用可扩展的 ID 生成服务,例如Snowflake。(当然,这涉及到安装、集成和维护所述服务;这样做的可行性是高度特定于项目的。)

于 2015-08-27T20:34:02.523 回答