我有一个表(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@H_502_4@现在,student_id,session_id和session_subject_id的组合将唯一地标识该学生对该会话主题的注释. @H_502_4@鉴于这些组合,它们是独一无二的,即使它们是外键,是否有优势,使它成为该表的组合主键? @H_502_4@再次感谢.
解决方法
使他们成为主要的关键将强制唯一性(而不是暗示它).
>主键大概是聚类的(取决于dbms),这将提高某些查询的性能.
>它保存添加唯一约束的空间,在某些DBMS中也创建唯一的索引. @H_502_4@无论您是否将这三个主键都设为主键,您仍然需要某种唯一性约束来保证学生不能与同一个会话和session_subject_id关联两次.如果允许这种情况,则需要将您的唯一性约束扩展为包括另一列. @H_502_4@不管你做了什么选择,你应该绝对有一些唯一性约束在桌子上. @H_502_4@如果您正在辩论是否在三列上创建一个代理主键一个唯一的约束,我会说这取决于该表是否具有子表.如果这样,那么引用代理键会更容易和更小.如果不是,那么IMO,代理关键并不真的给你很多,你也可以使用三列作为PK.
>主键大概是聚类的(取决于dbms),这将提高某些查询的性能.
>它保存添加唯一约束的空间,在某些DBMS中也创建唯一的索引. @H_502_4@无论您是否将这三个主键都设为主键,您仍然需要某种唯一性约束来保证学生不能与同一个会话和session_subject_id关联两次.如果允许这种情况,则需要将您的唯一性约束扩展为包括另一列. @H_502_4@不管你做了什么选择,你应该绝对有一些唯一性约束在桌子上. @H_502_4@如果您正在辩论是否在三列上创建一个代理主键一个唯一的约束,我会说这取决于该表是否具有子表.如果这样,那么引用代理键会更容易和更小.如果不是,那么IMO,代理关键并不真的给你很多,你也可以使用三列作为PK.