Sql server Oracle和SQL Server中的主键

Sql server Oracle和SQL Server中的主键,sql-server,oracle,orm,primary-key,Sql Server,Oracle,Orm,Primary Key,通过Oracle或SQL Server使用ORM处理主键的最佳实践是什么 Oracle-我应该使用序列和触发器还是让ORM来处理?还是有别的办法 SQL Server-我应该使用标识符数据类型还是其他方式?如果您使用的是任何类型的ORM,我建议您让它处理主键生成。在SQL Server和Oracle中。有时,表有一个自然的唯一标识符。例如,用户表中的每一行都可以由UserName列唯一标识。在这种情况下,最好使用用户名作为主键 还考虑用于形成多对多关系的表。UserGroupMembership

通过Oracle或SQL Server使用ORM处理主键的最佳实践是什么

Oracle-我应该使用序列和触发器还是让ORM来处理?还是有别的办法


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

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

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


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

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

请记住,databases的生命周期往往独立于前端应用程序。记录可以通过批处理、web服务、与其他数据库的数据交换,甚至是共享同一数据库的不同应用程序插入

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


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

没有名为“MsSQL”的产品。它是“SQL Server”。如果您使用正确的术语,人们会更容易找到您的问题。如果有可用的自然密钥,该怎么办?@John:如果有可用的自然密钥,我肯定会使用。我只是习惯了没有可用的自然密钥。:)对于SQL Server,使用GUID主键是一个非常糟糕的选择,因为默认情况下,priamry键也将是表的集群键,使用htat的GUID会导致非常糟糕的索引碎片和糟糕的性能。@marc_s:这个GUID与int PK的争论真的很无聊。SQL Server中的设计选择(就像任何东西一样)既有成本也有好处(我在最初的回答中提到了一些好处)。我还提到了性能惩罚(aka costs),在任何情况下都会被大大夸大。摩尔定律实施18个月后,2倍的性能损失就消失了,而且在任何情况下,GUID PK的性能损失甚至都不是2倍的损失。@marc_s:讽刺的是,将uniqueidentifier类型添加到SQL Server正是因为我使用和提倡它的原因:用于分布式/复制数据库。你是说你比SQL Server设计者更了解吗?我看不出OP在哪里提到在客户端上进行身份生成。你能说一下你在哪里看到的吗?这是MusicGenesis说的。APC想添加一些实际上不存在的东西,比如MusicGenesis中的“c”。=)