Database design 双主键设计

Database design 双主键设计,database-design,Database Design,我的数据库有一个跟踪部门和用户id的表。这里的问题是,虽然部门和用户id列可以有重复项,但它们的组合不能。这就是说, DepartmentA 0001 DepartmentA 0002 DepartmentB 0001 DepartmentB 0002 在我的表中是有效的数据。但是 DepartmentA 0001 DepartmentA 0001 无效 部门和用户id的组合构成了记录的唯一标识符。在另一个表中,我需要使用这个唯一标识符来跟踪用户的活动,比

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

DepartmentA    0001
DepartmentA    0002
DepartmentB    0001
DepartmentB    0002
在我的表中是有效的数据。但是

DepartmentA   0001
DepartmentA   0001  
无效

部门和用户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)
);
因此,我考虑使用双主键。IMHO是保证数据完整性的最佳方法。但据我所知,使用双主键可能非常困难,也就是说,它们不完全受支持,必须为其编写自定义查询


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

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

这是,我不认为是我的雇员号作为主键。这为许多场景提供了便利

所以,这就是我要做的

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

CREATE TABLE Department
(
   DepartmentId INT,
   DepartmentName
)
在Employee表中,EmployeeId是主键。此列仅包含一个数字,在问题域中没有任何意义。它在数据库中仅具有管理意义(唯一标识员工)

EmployeeNumber包含“用于标识员工的业务/域编号”)。请注意,我将此字段设置为VARCHAR字段,因为在示例中,您使用零来标记该数字。因此,事实上,它不应该是数字字段。:)

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

然后,用户活动表可以如下所示:

CREATE TABLE User_Activity
(
  EmployeeId INT,
  ActivityId INT
)

(我知道CREATE TABLE语句并不是真正正确的SQL语句,但这只是出于说明的目的。)

我会将您的主键创建为用户ID和部门的组合,并在该表中有另一个字段,即identity/autoincrement字段(也有唯一索引),并将该值用作对其他字段的FK引用


这假设您不经常删除和重新创建用户/部门对(因为每次都会断开与从属表的链接),在这种情况下,使用复合键作为FK引用可能更有意义。

我建议将代理项标识符作为主键,复合用户id和部门密钥作为备用唯一密钥。

只需创建单独的主键,并为(用户id,部门)创建新的唯一索引。

哪个ORM?这比database.prople和ADO.Net实体框架更重要,我认为在这种情况下平台或ORM并不重要;此时最重要的是Topicstarter应该有一个像样的DB设计,而不是100%的ATM。+1:代理密钥解决了所有这些“多密钥”问题。在我看来,它们的使用还不够。我发誓人们忘记了他们可以设置一个唯一的约束,而不是主键。回答得好。如果您必须按部门跟踪用户活动,此模式仍然有效吗?如果不是,最好的选择是什么?