扩展SQL表

时间:2015-04-13 21:24:53

标签: sql-server tsql

我有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的出版物听起来很奇怪,当我有更多的桌子时会引起混淆。

有人可以就此提出建议吗?

2 个答案:

答案 0 :(得分:0)

在您当前的架构安排中,如果不知道您的用例(以编程方式),可以提出您不需要任何扩展表的Id标识列的论点。我认为这对用户表来说是一对一的关系,所以你至少要在UserID列上有一个唯一的约束,无论如何你都可以得到它。

答案 1 :(得分:0)

我想考虑的事情是:

  • 教授可以成为不同的用户吗?
  • 教授是否有可能在没有用户的情况下存在?
  • 单个用户是否可能是两位教授(多学科?)

如果是这样,为什么你不会给每个教授一个唯一的Id(ProfessorId),只为User表创建一个外键(UserId,你可以称之为UserFk)。

在出版物表格中,您可以通过他/她的身份证明这位教授,并将其命名为ProfessorFk。这样,您可以在表之间创建非常有效的引用。发布表也将单个PublicationId作为主键。

如果我错了,请纠正我,我不知道你的用例。但教授可以拥有多种出版物似乎是合理的,但出版物也可以由多位教授撰写?这意味着你需要在出版物和教授之间为n-n关系增加一个表格。

关于创建作为组合键(Id,UserId)的教授键。我个人不喜欢组合键,如果你想从你的出版物表中引用这位教授,你需要两列。 这也表明你可以为同一个用户拥有多位教授,如果是这样,请选择单一的Id选项。

这意味着我将创建以下设置:

  • 用户表
    • UserId
  • 学生表
    • StudentId
    • UserFk
  • 教授表
    • ProfessorId
    • UserFk
  • 教授出版表
    • ProfessorFk
    • PublicationFk
  • 出版物表
    • PublicationId

因此,它部分取决于您希望如何处理数据,部分仅基于您的偏好。