Sql 使用两个Id';好主意是什么?

Sql 使用两个Id';好主意是什么?,sql,database-design,identification,Sql,Database Design,Identification,表格示例: ------------------------------------ | Id | ItemId | Description | Price | ------------------------------------ 两个Id(Id和ItemId)都是唯一的,并且是自动生成的。它们之间的区别在于,第一个Id(Id)用作表内标识的经典Id,第二个Id(ItemId)用作项标识字段,并且它抵抗表清理(执行经典Id重置时)和迁移 好主意还是坏主意?为什么?请解释。每个表实现(至少

表格示例:

------------------------------------
| Id | ItemId | Description | Price |
------------------------------------ 
两个Id(
Id
ItemId
)都是唯一的,并且是自动生成的。它们之间的区别在于,第一个Id(
Id
)用作表内标识的经典Id,第二个Id(
ItemId
)用作项标识字段,并且它抵抗表清理(执行经典Id重置时)和迁移


好主意还是坏主意?为什么?请解释。

每个表实现(至少)两个键是非常常见的做法:代理键,通常用于引用完整性目的(
Id
,在您的示例中)和自然键(又名域键或业务键),在业务域中用作标识符(在您的示例中可能是
ItemId

使用代理并不是一个普遍的好主意。您应该根据具体情况决定要实现的每个关键点的预期目的和优势。不要认为一种设计模式适合所有人。作为一条非常普遍的规则,选择和设计密钥的一些好标准是密钥属性的熟悉性、简单性和稳定性。除此之外,业务规则应该确定您需要什么密钥。拥有尽可能多的密钥,以准确地建模业务领域并维护数据完整性


就术语而言,如果你真的是指键,就不要使用Id这个词。Id太过模糊和重载。在关系/SQL数据库中,行由键标识。Id可以用于列名,但不是描述表设计或询问此问题的正确方式。

每个表实现(至少)两个键是非常常见的做法:代理键,通常用于引用完整性目的(
Id
)以及一个自然密钥(又名域密钥或业务密钥),用作业务域中的标识符(在您的示例中,可能是
ItemId

使用代理并不是一个普遍的好主意。您应该根据具体情况决定要实现的每个关键点的预期目的和优势。不要认为一种设计模式适合所有人。作为一条非常普遍的规则,选择和设计密钥的一些好标准是密钥属性的熟悉性、简单性和稳定性。除此之外,业务规则应该确定您需要什么密钥。拥有尽可能多的密钥,以准确地建模业务领域并维护数据完整性


就术语而言,如果你真的是指键,就不要使用Id这个词。Id太过模糊和重载。在关系/SQL数据库中,行由键标识。对于列名,Id是可以的,但不是描述表设计或询问此问题的正确方式。

实际上完全取决于您的要求。如果您的需求是说您需要标识,那么最好使用标识列。使用标识列不是一个好习惯,在数据级别没有意义,并且很难将标识列作为外键。建议您仅在数据中没有自然主键的情况下使用标识列

实际上完全取决于您的需求。如果您的需求是说您需要标识,那么最好使用标识列。使用标识列不是一个好习惯,在数据级别没有意义,并且很难将标识列作为外键。建议您仅在数据中没有自然主键的情况下使用标识列

什么是经典Id重置?当我们重新排列行时,重新计算它们的Id。另外,当我们在表/列表之间传输数据并且不想丢失原始标识码时,这可能很有用。这通常是个坏主意。您会对数百万行表和关联的FK执行此操作吗?我不这么认为。什么不好?重新排列还是双重身份?你好,阿曼。只是一个不相关的信息,最好在评论中添加@username。这样,username将在收件箱中收到有关您的评论的通知。例如:“@Mitch What's bad?etc”经典Id的重置是什么?当我们重新排列行时,重新计算它们的Id。另外,当我们在表/列表之间传输数据并且不想丢失原始标识码时,这可能很有用。这通常是个坏主意。您会对数百万行表和关联的FK执行此操作吗?我不这么认为。什么不好?重新排列还是双重身份?你好,阿曼。只是一个不相关的信息,最好在评论中添加@username。这样,username将在收件箱中收到有关您的评论的通知。例如:“@Mitch What's bad?等”