这只是一个宗教问题,因为人们寻求普遍的正确答案。您的团队和该SO线程都显示出很大的分歧这一事实应该表明,有充分的理由在不同情况下使用您描述的所有解决方案。如果表中没有其他属性或一组属性适合于唯一地标识行,则代理键很有用。在可能的情况下,最好使用自然键,以使表更易于阅读。自然键还允许从属表中的外键包含实际值而不是代理ID。例如,当您需要存储state(CA,TX,NY)时,最好使用char(2)自然键而不是int。在适当的地方使用复合主键。id当存在完美的复合键时,不要不必要地添加“ ”替代键(在多对多表中尤其如此)。在每个表中对三列键的授权都是绝对的废话。当您需要在多个站点上保留唯一性时,GUID是一种解决方案。如果您需要主键中的值唯一但又不是有序或连续的,则它们也很方便。INT vs. BIGINT:表需要主键的64位范围并不常见,但是随着64位硬件可用性的增加,它不应该成为负担,并且可以确保您不会溢出。INT当然较小,因此,如果空间有限,则可以带来一点优势。