【问题标题】:Primary Keys in Oracle and SQL ServerOracle 和 SQL Server 中的主键
【发布时间】:2009-08-16 06:06:56
【问题描述】:

在 Oracle 或 SQL Server 上使用 ORM 处理主键的最佳做法是什么?

Oracle - 我应该使用序列和触发器还是让 ORM 来处理?还是有其他方法?

SQL Server - 我应该使用标识符数据类型还是其他方式?

【问题讨论】:

  • 没有名为“MsSQL”的产品。它是“SQL 服务器”。如果您使用正确的术语,人们会更容易找到您的问题。

标签: sql-server oracle orm primary-key


【解决方案1】:

如果您使用任何类型的 ORM,我建议您让它处理您的主键生成。在 SQL Server 和 Oracle 中。

【讨论】:

    【解决方案2】:

    对于任一数据库,我都会使用客户端生成的 Guid 作为主键(映射到 SQL Server 中的 uniqueidentifier 或 Oracle 中的 RAW(20))。尽管使用 Guid 外键时 JOIN 会降低性能,但我倾向于使用断开连接的客户端和复制的数据库,因此必须能够在客户端上生成唯一 ID。在使用 ORM 时,Guid ID 也有优势,因为它们大大简化了您的生活。

    【讨论】:

    • 如果有可用的自然键怎么办?
    • @John:如果有可用的自然键,我肯定会使用自然键。我只是习惯了没有可用的自然键。 :)
    • 对于 SQL Server,使用 GUID 主键是一个非常糟糕的选择,因为默认情况下,主键也将是表的集群键,并且为 htat 使用 GUID 会导致上帝-糟糕的索引碎片和糟糕的性能。
    • @marc_s:这场 GUID 与 int PK 的辩论真的很烦人。 SQL Server 中的设计选择(就像任何东西一样)有成本和好处(我在原始答案中提到了一些好处)。我还提到了性能损失(又称成本),无论如何这往往被大大夸大了。摩尔定律 18 个月后,2 倍的性能损失就会消失,而且几乎没有任何情况下 GUID PK 的性能损失甚至是 2 倍的损失。
    • @marc_s:具有讽刺意味的是,将 uniqueidentifier 类型添加到 SQL Server 正是出于我使用和提倡它的原因:用于分布式/复制数据库。你是不是声称你比 SQL Server 设计者更了解?
    【解决方案3】:

    记住数据库的生命往往独立于前端应用程序是个好主意。记录可以通过批处理、Web 服务、与其他数据库的数据交换、甚至是共享同一数据库的不同应用程序来插入。

    因此,如果一个数据库表负责它自己的标识,或者至少具有这种能力,那么它是有用的。例如,在 Oracle 中,BEFORE INSERT 触发器可以检查是否为其主键提供了值,如果没有,则生成自己的值。

    Oracle 和 SQL Server 都可以生成 GUID,因此这不是将身份生成委托给客户端的充分理由。

    【讨论】:

    • 我没有看到 OP 在哪里说过要在客户端上完成身份生成。你能说出你在哪里看到的吗?
    • MusicGenesis 说的。
    • APC 想要添加实际上并不存在的东西——比如MusiGenesis 中的“c”。 =)
    【解决方案4】:

    有时,表有一个自然的、唯一的标识符。例如,User 表中的每一行都可以由 UserName 列唯一标识。在这种情况下,最好使用 UserName 作为主键。

    另外,考虑用于形成多对多关系的表。 UserGroupMembership 表将包含 UserId 和 GroupId 列,它们应该是主键,因为组合唯一标识了特定用户是特定组成员的事实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多