我有4个SQL表:用户,学生,教授和出版物。
所以我有:
create table dbo.[User] (
Id int identity not null
constraint PK_User_Id primary key clustered (Id),
-- Other user columns
)
create table dbo.Student (
UserId int not null
constraint PK_Student_UserId primary key clustered (Id),
-- Other student columns
)
create table dbo.Professor (
UserId int not null
constraint PK_Professor_Id primary key clustered (Id),
-- Other student columns
)
create table dbo.Publication (
Id int identity not null
constraint PK_Publication_Id primary key clustered (Id),
UserId int not null
-- Other student columns
)
alter table dbo.Student
add constraint FK_Student_UserId foreign key (UserId) references dbo.[User](Id);
alter table dbo.Professor
add constraint FK_Professor_UserId foreign key (UserId) references dbo.[User](Id);
alter table dbo.Publication
add constraint FK_Publication_UserId foreign key (UserId) references dbo.Professor(Id);
问题
我应该在教授和学生表中将列ID作为PK吗? 例如,将(Id,UserId)作为教授的PK(同学生) 然后出版将参考Professor.Id而不是Professor.UserId。
我问这个问题,因为从教授表中引用UserId的出版物听起来很奇怪,当我有更多的桌子时会引起混淆。
有人可以就此提出建议吗?
答案 0 :(得分:0)
在您当前的架构安排中,如果不知道您的用例(以编程方式),可以提出您不需要任何扩展表的Id标识列的论点。我认为这对用户表来说是一对一的关系,所以你至少要在UserID列上有一个唯一的约束,无论如何你都可以得到它。
答案 1 :(得分:0)
我想考虑的事情是:
如果是这样,为什么你不会给每个教授一个唯一的Id(ProfessorId),只为User表创建一个外键(UserId,你可以称之为UserFk)。
在出版物表格中,您可以通过他/她的身份证明这位教授,并将其命名为ProfessorFk。这样,您可以在表之间创建非常有效的引用。发布表也将单个PublicationId作为主键。
如果我错了,请纠正我,我不知道你的用例。但教授可以拥有多种出版物似乎是合理的,但出版物也可以由多位教授撰写?这意味着你需要在出版物和教授之间为n-n关系增加一个表格。
关于创建作为组合键(Id,UserId)的教授键。我个人不喜欢组合键,如果你想从你的出版物表中引用这位教授,你需要两列。 这也表明你可以为同一个用户拥有多位教授,如果是这样,请选择单一的Id选项。
这意味着我将创建以下设置:
因此,它部分取决于您希望如何处理数据,部分仅基于您的偏好。