7

关于我问题的第一部分:我最近问自己,为关系数据库中的某些表设置唯一标识符有什么好处和权衡。例如,Facebook (FB) Graph API 允许使用相同的 URL 获取不同类型的对象,例如“用户”、“事件”、“页面”等,例如https://domain/251906384206返回一个“事件”类型的对象,而https://domain/195466193802264返回“组”类型的对象。

与提供不太“通用”的 API 相比,这种方法的好处是什么,API 将以这种方式使用:https://domain/event/251906384206https://domain/group/195466193802264。在这种情况下,类似的标识符可能用于不同的对象类型,因为每个对象类型都有其标识符范围。

关于问题的第二部分:实现全球唯一标识符的选项有哪些?

我想到的两个选择是:

  1. 使用基于继承的方法(每类表、单个表等)。假设使用每类表的方法(超级表仅包含唯一标识符作为主键,表示对象类型的子表包含与超级表相同的标识符和附加数据),超级表和子表之间需要连接,这似乎很难扩展因为超级表成了瓶颈?

  2. 提供一个包含 3 列的表,其中包含

    • 唯一标识符,
    • 对象类型特定的主键,以及
    • 表名。

    每个对象类型的附加表包含将唯一标识符引用为外键的列。每个对象类型特定的表都有自己的主键范围。

这两种方法都允许提供像上面提到的 FB API 这样的通用 API。第二种方法将允许在内部使用对象表特定的主键并仅公开全局唯一标识符。但是,如果可能在内部使用全局唯一标识符,则第二种方法也需要连接。

是否有任何关于全球唯一标识符的优缺点的经验以及实施它的最佳实践是什么?

4

2 回答 2

0

“问题说得好,问题就解决了一半”。

在我看来,你混合了几个概念。您检查了其他数据库应用程序。但似乎您变得更加困惑而不是更加知情。

您有多个不同类的对象,并且想知道如何将它们存储在数据库中。这通常被称为对象关系映射 (ORM) 的“花哨名称”。

此外,您希望使用全局唯一标识符 (GUID) 将对象标识为业务/编程对象和表中的行。

此外,您还希望使用 GUID 来标识特定类型的类或对象。

假设您正在构建一个应用程序。你有几个对象。有几类对象,例如“用户”、“事件”、“页面”等。您可以拥有多个相同类/类型的对象,但您需要一种方法来区分一个对象。识别来自密歇根州的“John Doe”,来自昆士兰州的“John Doe”。假设您的对象将使用 GUID 类型的属性

因此,假设您为每个类创建一个表(“user”代表“Users”,表标准 id. 是单数和小写字母,您可以忽略它,“event”代表“events”,等等)。每个表都有几个表示每个对象属性的字段。所以“用户”会有一个像“user_key GUID”这样的字段,可能还有“user_name varchar(100)”和“user_birthdate datetime”。其他表也是如此。

我使用了“supertable”,但仅用于非常具体的、不常见的应用程序。我认为您不需要混合“用户”、“事件”、“页面”的表格。我有一个案例,我们有一个超级表“客户”,加上带有特定附加字段的“公司”和“个人”子表。有时,我们必须检查所有客户的销售额,并与“客户”表进行连接。有时,我们必须为产品提供公司折扣,并浏览“公司”子表。

如果你想要这个泛化/“IS a”超表,你不需要为超表主键和明细表主键设置不同的字段,可以是相同的类型。

我建议不惜一切代价避免使用复合/复合键(“主键”加“其他”字段),使用单个字段主键。我还建议使用编程分配 GUID 键,而不是在数据库中。

GUID 比整数键使用更多的内存和磁盘空间,但是,它非常快速和容易地获得一个很难复制的键。

同样,您的问题更多是如何在数据库中表示对象,而不是 GUID 的使用

于 2011-03-10T16:26:11.253 回答
0

您提出的实现全局标识符的两种方法都涉及大表的连接和数据库中记录数量的有效加倍(每个对象都是独立存在的,但他的父/记录也有它的全局 ID)。

我觉得在应用程序/数据访问层中强制执行全局 ID 会更好。这可以通过强制每个特定类型的对象的 ID 仅来自可能 ID 的子集来轻松完成。例如,您可以保留所有 ID 的最后/前 x 位来指定对象类型。ID 的其余部分将是“实际 ID”。

如果您在为特定表分配 ID 时害怕出错,您可以添加一个检查约束以强制 ID 正确(例如 ID < 4000 AND ID > 10000)。如果您担心其标识符中的对象类型浪费的位/字节,则可以仅在数据库访问 API 中公开全局 ID,这会将对象的 ID(实际存储在表中)与其类型 ID 连接起来(派生自对象类型)。

于 2011-03-28T03:55:34.887 回答