.net 复合键与BigInt主键-哪一个是较小的邪恶?

.net 复合键与BigInt主键-哪一个是较小的邪恶?,.net,entity-framework,composite-primary-key,bigint,table-per-type,.net,Entity Framework,Composite Primary Key,Bigint,Table Per Type,我有一个实体框架模型,其中包含一个表,该表预计将保存大量数据。我担心使用int主键,因为我希望它会变得更大。我正在考虑使用Int64来回避这个问题 这里是真正的关键——我在讨论中的表上使用每种类型的表继承。因此,如果我使用Int64,将会有其他几个表(实际上是任意数量的表,因为我将添加更多的表)必须使用Int64主键,即使它们超出int界限的可能性非常小。这似乎是一个低效的解决方案。想法 我正在考虑使用一个复合键,它由一个int-ID和一个子类型鉴别器组成,可能是一个char。我想知道这种方法对

我有一个实体框架模型,其中包含一个表,该表预计将保存大量数据。我担心使用int主键,因为我希望它会变得更大。我正在考虑使用Int64来回避这个问题

这里是真正的关键——我在讨论中的表上使用每种类型的表继承。因此,如果我使用Int64,将会有其他几个表(实际上是任意数量的表,因为我将添加更多的表)必须使用Int64主键,即使它们超出int界限的可能性非常小。这似乎是一个低效的解决方案。想法

我正在考虑使用一个复合键,它由一个int-ID和一个子类型鉴别器组成,可能是一个char。我想知道这种方法对性能的影响。我一直更喜欢代理键,除非它是一个简单的关联实体。有比这两种方法更好的方法吗?以下哪一条是更好的路线

更新:

我想澄清的是,我正在考虑的复合键不是一个自然的复合键。它只包含ID和子类型鉴别器。我对使用它来避免int主键的大小限制感兴趣。我主要关注的是:

1) 使用Int64主键是否存在性能问题?特别是在每类型表继承中,它仅对父表是必需的,但也必须在子表中使用

2) 使用复合键(非自然)来实现比int主键更大的范围是否比使用Int64键来实现相同的操作具有任何性能优势?

请查看。基本上,为什么不同时使用两者呢?对外键使用整数代理键,但确保存在有意义的复合自然键(如果正确的自然键是复合键),以确保数据一致性并将插入重复行的风险降至最低

BigintId  firstName LastName   Phone        Gender   Birthdate
  1         Bob      Smith    111 234-5678    M     1 jan 1978
  2         Bob      Smith    111 234-5678    M     1 jan 1978
  3         Bob      Smith    111 234-5678    M     1 jan 1978
  4         Bob      Smith    111 234-5678    M     1 jan 1978

仅仅因为它们有不同的id,这些实体真的不同吗?只有当我们盲目地重新定义不同,仅仅意味着它有一个不同的键

除了意见,你希望得到什么样的答案?我听到了,但意见可以帮助我权衡各种选择。你为什么不创建一个基本的应用程序,演示如何使用数据库并分析每个设计?我最初的意见是不要担心它,而是选择最有意义的方法,目前这似乎是
bigint
解决方案。数据库可以非常有效地处理整数值,如果这成为您的第一个主要问题,我会感到惊讶。我更喜欢使用单个键,即使它是代理项并且存在“真实”的自然键。如果您只需要在单个列上进行联接,而不必在整个模型中使用2、3、5或10个组合键列,那么联接该表就变得非常容易,这样您就可以联接了……没有必要妥协。您不需要只选择一个。表可以有多个键。同时使用联接和FK的单个代理项键和复合自然键以确保数据一致性。