2013-02-07 49 views
2

我需要创建一个数据库,动物园将使用它来跟踪他们的动物和雇员等。我需要帮助的唯一的事情是服务表,这将用于记录对动物进行的服务,例如疫苗接种或健康检查。需要记录的信息是执行服务的员工(假定只有一名员工对每项服务负责),正在服务的动物,执行的服务以及执行的日期/时间。5现场复合PK与代理PK

我的主要问题是在第一个表中显示的复合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   | 
+-------------------+ 

回答

1

首先,不要将日期和时间分隔成两列。调用单个列“service_time”。

如果组列{animal_id,EMPLOYEE_ID,SERVICE_TYPE,service_time}的唯一标识一行,你必须有该组列的唯一约束不管你是否决定使用一个代理键。如果您不使用代理键,则通常将该限制声明为primary key。如果使用代理键,那么通常会将该约束声明为unique,并且该集中每列的个别not null约束。

如果没有任何表的外键引用这个之一,那么创建一个额外的列作为代理键绝对没有意义。而且就我个人而言,即使那样,我也不会使用代理键。我知道如何编写一个连接。无论如何,大多数图形化查询工具都会为你加入。