【问题标题】:Setting the correct primary key for tables in a database model为数据库模型中的表设置正确的主键
【发布时间】:2016-11-21 02:44:45
【问题描述】:

我正在制作一个新的实体框架模型,以便以更清洁、更准确的方式存储我们的数据。我们目前的数据库(在 Access 中)充满了重复和不可靠的数据,并且不是由数据库专家计划的,因此经常完全丢失主键。它也非常大,因此查询需要很长时间(即使有索引)。

在新的数据库模型中,我希望它能够为一个部门的员工提供快速输入,并为其他所有人提供快速选择。我们有超过一百万条记录的表,更不用说审计表了,当然这些表要大得多。

我的模型有一个以 companyID 作为主键的 company 表,一个以 contactID 作为主键的联系人表,然后是一个名为 CompanyContact 的关联表,其中 companyID 和 contactID 都设置为其主键。然后我需要将其他表关联到这个关联表。例如,如果我想存储员工和联系人(他们可能同时为超过 1 家公司工作)之间的交互,我可以为这个交互表设置主键为 companyID、contactID 和 EmployeeID,但我会有3个主键。 (我在数据库中还有很多关于这个问题的其他场景。)

我记得读过(某处...)向表提供超过 1 个主键会减慢查询速度。他们建议(根据上述示例)为 CompanyContact 表提供一个 id 字段作为主键,以及 2 个外键(CompanyID 和 ContactID),然后将交互表与该 id 字段相关联。我更习惯于按照他们推荐的方式进行操作,但我已经看到,从外键中创建多个主键可以在根目录停止重复,而无需在任何地方对其进行编码。

谁能告诉我拥有多个主字段会在多大程度上减慢查询速度以及最推荐的方法是什么?提前致谢!

【问题讨论】:

  • 一张表最多只能有一个主键。您误解了您阅读的内容。
  • 我认为你的意思是复合键而不是多个主键

标签: sql-server database entity-framework


【解决方案1】:

您正在考虑使用复合主键与代理键。关于这个话题有很多争论。

复合键具有使行唯一的所有字段,如果它们都是 int 或 bigint,则可以很好地工作,如果它们是较大的(即 varchar)字段,则不能正常工作。密钥长度也有一个最大值,您必须保持在该最大值之下。

代理键方法可能有一个自动递增整数,并且键字段上会有一个唯一索引以防止重复。

对于为多家公司工作的员工,最好将 A 公司的员工与 B 公司的同一员工视为一个独立的实体。如果不是,我会选择更复杂的设计。人员表,员工表,其中同一个人记录可能与许多员工记录相关。每位员工都根据雇佣“合同”与公司建立联系。

我会对通讯录做同样的事情。这样一来,您的沟通设计就变得简洁明了,同时仍然支持从多个公司(供应商、客户等)识别同一“人”的查询

这样你提到的表只需要employeeid和contactid作为key。否则你需要contactcompany 和employeecompany?

只是根据我阅读您的请求的方式提出的一些想法。有关高级实体设计的课程或好书确实有助于确保您从一开始就获得最佳设计,并且从长远来看可以为您节省大量时间来尝试发现和重构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多