Jef*_*eff 13 sql ms-access primary-key composite-key composite-primary-key
我正在开发一个喜欢自动编号标识符的Access数据库.每个表都使用它们,除了一个,它使用由一个人的名字,姓氏和出生日期组成的密钥.无论如何,人们开始遇到很多重复问题,因为表示关系的表可以保持两次或更多次相同的关系.我决定通过为关系表实现复合键来解决这个问题,因此我没有遇到重复问题.
所以我想知道Access世界中复合键的错误代表是什么?我想编写查询会稍微困难一些,但至少每次输入数据或在前端编辑数据时都不需要进行大量的检查.他们是非常低效还是什么?
Guf*_*ffa 12
复合键适用于单个表,但是当您开始在表之间创建关系时,它可以获得更多.
考虑两个表Person和Event,以及它们之间的许多一对多的关系称为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)
另一方面,如果您有Person和Event表的自动编号键,则表中只需要两个字段Appointment来标识关系,条件要小得多:
select Person,*, Event.*
from Person, Event, Appointment
where
Person.Id = Appointment.PersonId and Event.Id = Appointment.EventId
Run Code Online (Sandbox Code Playgroud)
如果您只使用纯自编SQL来访问您的数据,那么它们就可以了.
但是,某些ORMs,适配器等需要使用单个PK字段来标识记录.
另请注意,复合主键几乎总是一个自然键(创建代理复合键几乎没有意义,您也可以使用单字段键).
复合主键的最常见用法是多对多链接表.
当使用自然键,你应该确保他们是天生的独特和不可变的,那就是总是由关键,一旦被模型反映了相同的值标识的实体,并且只有一个实体可以通过任意值来标识.
在你的情况下不是这样.
首先,一个人可以改变他们的名字甚至生日
其次,我很容易想象两个John Smiths在同一天出生.
前者意味着如果一个人改变他们的名字,你将不得不在每个引用的表中更新它persons; 后者意味着第二个John Smith将无法进入您的数据库.
对于像你这样的情况,我真的会考虑为你的模型添加一个代理标识符.
它使查询和维护变得复杂。如果您真的对这个主题感兴趣,我建议您查看已经涵盖此主题的帖子数量。这将为您提供比此处任何回复更好的信息。
https://stackoverflow.com/search?q=composite+primary+key
| 归档时间: |
|
| 查看次数: |
1733 次 |
| 最近记录: |