外键是否应成为表主键?

Car*_*ton 14 database foreign-keys primary-key

我有一个表(session_comments)与以下字段结构:

student_id (foreign key to students table)
session_id (foreign key to sessions table)
session_subject_ID (foreign key to session_subjects table)
user_id (foreign key to users table)
comment_date_time
comment
Run Code Online (Sandbox Code Playgroud)

现在,student_id,session_id和session_subject_id的组合将唯一地标识关于该会话主题的该学生的评论.

鉴于它们是唯一的,即使它们是外键,我是否有优势使它们成为该表的组合主键?

再次感谢.

Tho*_*mas 14

  1. 将它们作为主键将强制独特性(而不是暗示它).
  2. 主键可能是聚类的(取决于dbms),这将提高某些查询的性能.
  3. 它节省了添加唯一约束的空间,在某些DBMS中也创建了唯一索引.

无论是否将这三者作为主键,您仍然需要某种唯一性约束来保证学生不能与同一会话和session_subject_id关联两次.如果允许该方案,则需要将唯一性约束扩展为包含另一列.

无论你做出什么选择,你都应该对表格有一些独特的限制.

如果您正在讨论是否在三列上创建代理主键+唯一约束,我会说这取决于该表是否具有子表.如果可以,那么引用代理键将更容易和更小.如果它不会,那么IMO,代理键并没有真正给你太多,你也可以使用三列作为PK.


Pat*_*rez 6

这取决于应用程序的其余部分.
如果您不打算在评论表中显示外键(这似乎很可能),这很好.
如果你需要引用另一个表中的注释,你最好用你的3个字段创建一个唯一的索引,加上一个AutoNumber主键,它将作为外键在其他表中提供(比3更简单,更便宜)字段).