mowalid0 Asked: 2024-11-22 16:30:22 +0800 CST2024-11-22 16:30:22 +0800 CST 2024-11-22 16:30:22 +0800 CST 大学强制数据库项目中的问题 772 我现在正在制作一个银行系统数据库,在帐户实体的情况下,将其作为外键(分支机构 ID、客户 ID、服务 ID、四个生成的整数)的主键组合,用于贷款等上下文服务,或者使它们仅为普通外键。如果您可以提供一个更一般的案例,其中复合键是最佳用例 database-design 1 个回答 Voted Best Answer Uddyan Semwal 2024-11-22T21:08:23+08:002024-11-22T21:08:23+08:00 1.银行系统中的主键: 对于银行系统中的账户实体,目标是唯一地标识每个账户,同时保持与分支机构、客户和服务(例如贷款服务)等其他实体的参照完整性。 选项 1:复合主键 复合键是由多个属性组成的主键。 就您而言,您正在考虑由以下属性组成的复合键: branch_id (foreign key to Branch) client_id (foreign key to Client) service_id (foreign key to Service, such as Loan) 四个生成的整数(用于唯一性) 复合键的用例:在这些属性的组合自然形成唯一实体的情况下,可以使用复合主键。例如: 特定客户可能在特定分行拥有特定服务(贷款、信用卡等)的账户。如果 branch_id、client_id 和 service_id 的组合不够唯一,则生成的四个整数将确保唯一性。为什么要使用复合键? 强制唯一性:如果您确信这些外键与生成的整数的组合构成帐户的唯一且有效的表示,那么复合键是有意义的。规范化:这种方法将确保不存储冗余数据,并且每个帐户都与分支机构、客户和服务类型的组合唯一地相关联。数据完整性:通过使用外键作为主键的一部分,您可以确保每个帐户始终与引用表中的有效记录相关联。但是,复合键可能有一些缺点: 复杂性: 复合键会使查询和连接更加复杂,尤其是在处理多个外键时。性能:对复合键进行索引的效率可能低于对单个键(如 account_id)进行索引。这可能会影响性能,尤其是在数据库增长时。 选项 2: 使用普通外键 或者,您可以选择将每个外键(例如 branch_id、client_id、service_id)保留为单独的列,并使用代理主键(如 account_id)(唯一标识符,如 account_id INT PRIMARY KEY)。 普通外键+代理键的用例: 在这种方法中,每个外键都引用相关实体(分支机构、客户、服务),但帐户实体的主键是针对每个帐户生成的代理唯一键(account_id),独立于外键。 为什么要使用普通外键+代理键? 简单性:这种方法更简单、更灵活,因为主键 (account_id) 是每条记录的单一唯一标识符。这可以简化索引、查询和连接表。可扩展性:在大型系统中,使用像 account_id 这样的单一代理键可以更高效,因为使用单列主键时索引和查询优化更容易。解耦:主键不依赖于外键,这使得维护和修改架构更容易,而不会影响主键的完整性。 2.何时应使用组合键? 在下列情况下,组合键通常是一个不错的选择: 自然关系:当多个列(例如 branch_id、client_id 和 service_id)的组合自然形成一行的唯一标识符时,您希望在数据库级别强制该唯一性。 例如,如果分行、客户和服务类型的组合始终是唯一的,那么复合键可能效果很好。但是,如果这些组合中的任何一个可能出现多次(例如,客户可能在同一分行拥有多个贷款账户),那么复合键可能并不理想。 多对多关系:复合键通常用于连接表(多对多关系),其中每条记录代表外键的唯一组合。例如,在跟踪客户订阅了哪些服务的“account_services”表中,如果 client_id 和 service_id 的组合是唯一的,则复合键可能很合适。 CREATE TABLE account_services ( client_id INT, service_id INT, branch_id INT, UNIQUE(client_id, service_id, branch_id), PRIMARY KEY(client_id, service_id, branch_id) );
1.银行系统中的主键:
对于银行系统中的账户实体,目标是唯一地标识每个账户,同时保持与分支机构、客户和服务(例如贷款服务)等其他实体的参照完整性。
选项 1:复合主键 复合键是由多个属性组成的主键。 就您而言,您正在考虑由以下属性组成的复合键:
四个生成的整数(用于唯一性) 复合键的用例:在这些属性的组合自然形成唯一实体的情况下,可以使用复合主键。例如:
特定客户可能在特定分行拥有特定服务(贷款、信用卡等)的账户。如果 branch_id、client_id 和 service_id 的组合不够唯一,则生成的四个整数将确保唯一性。为什么要使用复合键?
强制唯一性:如果您确信这些外键与生成的整数的组合构成帐户的唯一且有效的表示,那么复合键是有意义的。规范化:这种方法将确保不存储冗余数据,并且每个帐户都与分支机构、客户和服务类型的组合唯一地相关联。数据完整性:通过使用外键作为主键的一部分,您可以确保每个帐户始终与引用表中的有效记录相关联。但是,复合键可能有一些缺点:
复杂性: 复合键会使查询和连接更加复杂,尤其是在处理多个外键时。性能:对复合键进行索引的效率可能低于对单个键(如 account_id)进行索引。这可能会影响性能,尤其是在数据库增长时。 选项 2: 使用普通外键 或者,您可以选择将每个外键(例如 branch_id、client_id、service_id)保留为单独的列,并使用代理主键(如 account_id)(唯一标识符,如 account_id INT PRIMARY KEY)。
普通外键+代理键的用例:
在这种方法中,每个外键都引用相关实体(分支机构、客户、服务),但帐户实体的主键是针对每个帐户生成的代理唯一键(account_id),独立于外键。
为什么要使用普通外键+代理键?
简单性:这种方法更简单、更灵活,因为主键 (account_id) 是每条记录的单一唯一标识符。这可以简化索引、查询和连接表。可扩展性:在大型系统中,使用像 account_id 这样的单一代理键可以更高效,因为使用单列主键时索引和查询优化更容易。解耦:主键不依赖于外键,这使得维护和修改架构更容易,而不会影响主键的完整性。
2.何时应使用组合键?
在下列情况下,组合键通常是一个不错的选择:
自然关系:当多个列(例如 branch_id、client_id 和 service_id)的组合自然形成一行的唯一标识符时,您希望在数据库级别强制该唯一性。
例如,如果分行、客户和服务类型的组合始终是唯一的,那么复合键可能效果很好。但是,如果这些组合中的任何一个可能出现多次(例如,客户可能在同一分行拥有多个贷款账户),那么复合键可能并不理想。
多对多关系:复合键通常用于连接表(多对多关系),其中每条记录代表外键的唯一组合。例如,在跟踪客户订阅了哪些服务的“account_services”表中,如果 client_id 和 service_id 的组合是唯一的,则复合键可能很合适。