在关系数据库中,复合键是由两个或多个列组成的**主键**,而不是单个列。这种列的组合确保了表中每一行都能被唯一标识,即使单独的列都不能保证唯一性。例如,考虑一个存储电子商务系统订单详情的表。单个订单可能包含多个产品,因此仅使用 order_id
列作为主键是行不通的——每个订单可能有多条记录。但是,将 order_id
和 product_id
组合成一个复合键可以确保订单中的每个产品都被唯一标识。复合键在实体之间的关系需要多列唯一性约束的情况下特别有用。
复合键通常用于建模多对多关系或关联实体。例如,在学生-课程注册表中,单独的 student_id
和 course_id
都不能唯一标识一行,因为一个学生可以注册多门课程,一门课程可以有很多学生。通过将这两列组合成一个复合键,数据库可以强制执行一个学生不能多次注册同一门课程。复合键也与现实世界的业务规则相符。在航班预订系统中,flight_number
、departure_date
和 seat_number
的复合键可以确保没有两个乘客被分配到同一航班上的同一个座位。这种方法避免了对人为标识符的需求,同时保持了数据的完整性。
然而,复合键也存在缺点。它们会使查询编写变得复杂,尤其是在连接表时。如果另一个表引用了复合键,则其外键必须包含复合键的所有列,这增加了复杂性。例如,如果发票表引用了订单详情复合键(order_id
,product_id
),则发票表必须在其外键约束中包含这两列。此外,复合键可能会影响性能,因为对多个列进行索引可能不如对单个代理键(如自动递增的整数)进行索引有效。开发人员经常权衡自然复合键的优势与代理键的简单性,并根据查询模式、可扩展性需求和可维护性进行选择。总之,复合键是强制执行多列唯一性的强大工具,但需要仔细考虑其对数据库设计和使用的影响。