database - 一对多关系:复合主键还是单主键?
问题描述
我有一个person
包含个人信息的表格,还有另一个表格person_contact
来存储有关该人的联系信息(type
显示它是电话记录还是电子邮件记录,并record
包含实际的电话号码或电子邮件地址)。
在person_contact
我已经声明pcont_id
和person_id
作为 PK whileperson_id
是一个 FK 引用person.person_id
。我需要PKpcont_id
吗?何时应在一对多关系中使用单个 PK,何时使用复合 PK 更好?
解决方案
您不需要person_id
作为person_contact
表中主键的一部分。pcont_id
如果两个表之间存在一对多关系,则应该是主键。
我需要PK pcont_id 吗?
我建议,它应该在那里并且应该是您的表的主键,假设您可以为一个人拥有多个联系人。
如果一个人只能有一个联系人,在这种情况下您不需要该表本身,您可以将数据直接存储在人员表中。
如果您仍想单独存储它,那么您不需要pcont_id
列,您的person_id
列应标记为主键。
何时应在一对多关系中使用单个 PK,何时使用复合 PK 更好?
junction table/associative table
当您需要映射多对多关系时,使用复合主键。在一对多关系的情况下,您不需要带有外键列的复合主键。
推荐阅读
- python - How to add a newline between sequences with Pyyaml?
- c# - .NET 在执行调用需要较低权限的 COM+ 的特定代码块时降级管理员提升或冒充当前用户
- css - 了解响应式表单 (React) 和冗余的 Flexbox 层次结构?
- amazon-web-services - 启用“自动配置 CloudWatch 日志”时的 AWS 任务定义警告
- python - 用另一个可迭代对象有效地分割可迭代对象
- r - 使用 R 进行 2D 三次插值
- javascript - for 循环中的 addEventListener 仅适用于最后一个元素
- php - 尝试在刀片中获取非对象属性时出错
- html - 内联 Vimeo 按钮覆盖
- vba - 当数据为数千时,我的对帐 VBA 宏运行时间过长