database - 5场复合PK vs代理PK

标签 database relational-database primary-key composite-key

我需要创建一个数据库,动物园将使用该数据库来跟踪他们的动物和员工等。我唯一需要帮助的是服务表,该表将用于记录对动物执行的服务,因为例如,疫苗接种或健康检查。需要记录的信息包括提供服务的员工(假设只有一名员工负责每项服务)、接受服务的动物、提供的服务以及提供服务的日期/时间。

我的主要问题是在第一个表中显示的复合 PK 和第二个表中显示的替代 PK 之间进行选择。您能否就哪种设计最合适以及每种方法的优缺点给我您的意见。

在此先感谢您的帮助。

+-----------------------+
|  Service              |                     
+-----------------------+
| (PK)(FK1) animal_id   |
| (PK)(FK2) employee_id |
| (PK) service_type     |
| (PK) date             |
| (PK) time             |
+-----------------------+

+-------------------+
|  Service          |                     
+-------------------+
| (PK) service_id   |
| (FK1) animal_id   |
| (FK2) employee_id |
| service_type      |
| datetime          |
+-------------------+

最佳答案

首先,不要将日期和时间分成两列。将该单个列称为“service_time”。

如果列集 {animal_id, employee_id, service_type, service_time} 唯一标识一行,则无论您是否决定使用代理键,您必须对该列集有唯一约束.如果您不使用代理键,则该约束通常声明为 primary key。如果您确实使用代理键,则该约束通常被声明为唯一,并且对该集合中的每一列都有单独的not null约束。

如果没有任何表具有对这个 表的外键引用,则绝对没有必要创建一个额外的列作为代理键。就我个人而言,即便如此,我也不会为此表使用代理键。我知道如何编写连接。无论如何,大多数图形查询工具都会为您进行连接。

关于database - 5场复合PK vs代理PK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14762896/

相关文章:

ruby-on-rails - 希望将YouTube视频数据存储到我的Rails数据库中

java - 通过 ODBC 连接使用 Hibernate

mongodb - 为什么多值字段在关系数据库中不是一个好主意

mysql - 为什么auto_increment id不一一增加,怎么设置呢?

javascript - Ember : Change model's primary key with FixtureAdapter

mysql - 使用 PostgreSQL 模式文件将 mySQL 数据移动到 postgres

javascript - Jquery:如何从内容中获取属性

mysql - 设置表关系 "Cascade"、 "Set Null"和 "Restrict"做什么?

mysql - 客户、供应商及其员工

mysql - 在 MySQL 中使用下划线 _ 作为主键