Database design 双主键设计
我的数据库有一个跟踪部门和用户id的表。这里的问题是,虽然部门和用户id列可以有重复项,但它们的组合不能。这就是说,Database design 双主键设计,database-design,Database Design,我的数据库有一个跟踪部门和用户id的表。这里的问题是,虽然部门和用户id列可以有重复项,但它们的组合不能。这就是说, DepartmentA 0001 DepartmentA 0002 DepartmentB 0001 DepartmentB 0002 在我的表中是有效的数据。但是 DepartmentA 0001 DepartmentA 0001 无效 部门和用户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:代理密钥解决了所有这些“多密钥”问题。在我看来,它们的使用还不够。我发誓人们忘记了他们可以设置一个唯一的约束,而不是主键。回答得好。如果您必须按部门跟踪用户活动,此模式仍然有效吗?如果不是,最好的选择是什么?