具有外键和主键的主子表

时间:2018-06-22 20:46:21

标签: sql sql-server

我正在设计一个SQL Server数据库。对于以下情况,哪种方法是正确的?

第一种方法:

First approach using foreign key also in primary key

第二种方法:

Second approach using foreign key only as unique key

2 个答案:

答案 0 :(得分:1)

如果您希望某个用户仅属于单个用户类型,这就是我的处理方式:

create table UserTypes (User_Type_Id int identity(1,1) primary key
                        ,UserDescription varchar(256))

create table Users (UserId int identity (1,1) primary key
                    ,User_Type_Id int foreign key references UserTypes (User_Type_Id)
                    ,FirstName varchar(64)
                    ,LastName varchar(64)
                    ,Email varchar(256))

一些评论...

  • 这使用IDENTITY属性,在此示例中,该属性会自动从1增加到2+十亿
  • 我会将名字分为第一和最后,所以您不必稍后再进行划分,而会使名称标准化带来麻烦
  • 我会避免使用SQL Server使用的DESCRIPTIONUSER_ID之类的保留字,因此需要将其括在方括号中。

如果您希望某个用户成为多种用户类型的一部分,那么也许:

create table UserTypes (User_Type_Id int identity(1,1) primary key
                        ,UserDescription varchar(256))

create table Users (UserId int identity (1,1) not null
                    ,User_Type_Id int foreign key references UserTypes (User_Type_Id) not null
                    ,FirstName varchar(64)
                    ,LastName varchar(64)
                    ,Email varchar(256))

alter table Users 
add constraint PK_UserID_UserType PRIMARY KEY CLUSTERED(UserId, User_Type_Id)

答案 1 :(得分:0)

在不了解您的项目的情况下,我将假设第一个是错误的。首先,表上不能有两个主键。主键或唯一的聚集索引可组织表的物理顺序。您无法通过两种方式进行组织。您可以将两列PK转换为复合键没有问题。其次,即使将用户类型ID更改为唯一而不是PK,这也意味着每个类型ID只能存在1个用户。一旦您尝试使另一个具有相同类型id的用户,就会违反该唯一约束。

第二个模型看起来更好。它假定不能有具有相同角色/用户类型的同一个人。但是用户表中的typeID应该是FK而不是PK。