我正在设计一个SQL Server数据库。对于以下情况,哪种方法是正确的?
第一种方法:
第二种方法:
答案 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+十亿DESCRIPTION
和USER_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。