当前位置:  开发笔记 > 数据库 > 正文

双主键设计

如何解决《双主键设计》经验,为你挑选了1个好方法。

我的数据库有一个跟踪部门和用户ID的表.这里的问题是虽然department和user_id列可以有重复项,但它们的组合却不能.这就是说,

DepartmentA    0001
DepartmentA    0002
DepartmentB    0001
DepartmentB    0002

是我表中的有效数据.但

DepartmentA   0001
DepartmentA   0001  

不是有效.

department和user_id的组合形成记录的唯一标识符.在另一个表格中,我需要使用这个唯一标识符来跟踪用户的活动,例如他们进入建筑物的时间,他们离开建筑物的时间等.

我在想的是我创建了下表

CREATE TABLE user (
 user_id INT( 4 ),
 department VARCHAR( 25 ) NOT NULL ,
 combined_id int(4) ,
 UNIQUE ( combined_id ) ,
 Primary key(user_id, department)
 );



CREATE TABLE user_activity(
combined_id int(4),
activity varchar(25),
Foreign Key (combined_id) references user(combined_id)
);

所以我正在考虑为我的目的使用双主键.恕我直言,这是保证数据完整性的最佳方式.但据我所知,使用双主键可能很难与ORM一起使用,即它们不是完全支持的,并且必须为它编写自定义查询.

鉴于我的情况,上述设计是最好的吗?



1> Frederik Ghe..:

我会使用代理主键,并对应该保持唯一的那两个字段的组合设置唯一约束.

也就是说,我不会将我的员工编号视为主键.这有利于很多场景.

所以,这就是我要做的

CREATE TABLE Employee
(
  EmployeeId INT ,
  EmployeeNumber VARCHAR(4),
  DepartmentId INT,
  EmployeeName
)

CREATE TABLE Department
(
   DepartmentId INT,
   DepartmentName
)

在Employee表中,EmployeeId是主键.此列只包含一个数字,在问题域中没有任何意义.它在数据库中只具有管理含义(唯一标识一个Employee).

EmployeeNumber包含用于标识员工的业务/域号.请注意,我已将此字段设为VARCHAR字段,因为您在示例中使用零来对该数字进行LPAD.所以实际上,它不应该是一个数字字段.:)

除此之外,Employees表中还有一个DepartmentId列,它是Department表的外键.在Employee表中,您应该在EmployeeNumber/DepartmentId字段上放置一个Unique约束.(因此,对两个列的组合有一个约束).

然后,User_Activity表可以如下所示:

CREATE TABLE User_Activity
(
  EmployeeId INT,
  ActivityId INT
)

(我知道CREATE TABLE语句实际上并不是真正正确的SQL语句,但这只是为了说明目的).

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有