为什么我在使用复合键时阅读了这么多负面意见?

Jef*_*eff 13 sql ms-access primary-key composite-key composite-primary-key

我正在开发一个喜欢自动编号标识符的Access数据库.每个表都使用它们,除了一个,它使用由一个人的名字,姓氏和出生日期组成的密钥.无论如何,人们开始遇到很多重复问题,因为表示关系的表可以保持两次或更多次相同的关系.我决定通过为关系表实现复合键来解决这个问题,因此我没有遇到重复问题.

所以我想知道Access世界中复合键的错误代表是什么?我想编写查询会稍微困难一些,但至少每次输入数据或在前端编辑数据时都不需要进行大量的检查.他们是非常低效还是什么?

Guf*_*ffa 12

复合键适用于单个表,但是当您开始在表之间创建关系时,它可以获得更多.

考虑两个表PersonEvent,以及它们之间的许多一对多的关系称为Appointment.

如果Person表中的复合键由名字,姓氏和出生日期组成,并且Event表格中的复合关键字由地点和名称组成,则Appointment表格中将有五个字段用于标识关系.

绑定关系的条件将很长:

select Person,*, Event.*
from Person, Event, Appointment
where
  Person.FirstName = Appointment.PersonFirstName and
  Person.LastName = Appointment.PersonLastName and
  Person.BirthDate = Appointment.PersonBirthDate and
  Event.Place = Appointment.EventPlace and
  Event.Name = Appointment.EventName`.
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您有PersonEvent表的自动编号键,则表中只需要两个字段Appointment来标识关系,条件要小得多:

select Person,*, Event.*
from Person, Event, Appointment
where
  Person.Id = Appointment.PersonId and Event.Id = Appointment.EventId
Run Code Online (Sandbox Code Playgroud)

  • @HLGEM:是的,你通常会使用`join`,但这更能说明这一点.这就是我们在`join`命令存在之前加入的方式. (3认同)

Qua*_*noi 7

如果您只使用纯自编SQL来访问您的数据,那么它们就可以了.

但是,某些ORMs,适配器等需要使用单个PK字段来标识记录.

另请注意,复合主键几乎总是一个自然键(创建代理复合键几乎没有意义,您也可以使用单字段键).

复合主键的最常见用法是多对多链接表.

当使用自然键,你应该确保他们是天生的独特不可变的,那就是总是由关键,一旦被模型反映了相同的值标识的实体,并且只有一个实体可以通过任意值来标识.

在你的情况下不是这样.

首先,一个人可以改变他们的名字甚至生日

其次,我很容易想象两个John Smiths在同一天出生.

前者意味着如果一个人改变他们的名字,你将不得不在每个引用的表中更新它persons; 后者意味着第二个John Smith将无法进入您的数据库.

对于像你这样的情况,我真的会考虑为你的模型添加一个代理标识符.

  • 我最近读了一个故事,其中两名同名,姓名和出生日期相同的女性同时在医院就诊. (2认同)

Abe*_*ler 1

它使查询和维护变得复杂。如果您真的对这个主题感兴趣,我建议您查看已经涵盖此主题的帖子数量。这将为您提供比此处任何回复更好的信息。

https://stackoverflow.com/search?q=composite+primary+key