Sql server 扩展SQL表

Sql server 扩展SQL表,sql-server,tsql,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 ( Us

我有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)作为教授的主键(与学生相同)
然后发布将引用Professor.Id而不是Professor.UserId

我这样问是因为有出版物引用Professor表中的用户ID听起来很奇怪,当我有更多的表时,这可能会让人困惑


有人能给我一些建议吗?

在您当前的模式安排中,在不了解您的用例(以编程方式)的情况下,您可以提出这样的论点:您不需要任何扩展表的Id-identity列。我认为这将是一个1到1的关系到用户表无论如何,所以你至少想要一个独特的约束在USEID列,你会得到通过使它成为PK无论如何。

< P>我想考虑的事情是:

  • 教授能成为不同的用户吗
  • 一个教授是否可能在没有使用者的情况下生存
  • 一个用户可能是两个教授(多个学科)吗
如果是这样的话,为什么不给每个教授一个唯一的Id(ProfessorId),只为用户表创建一个外键(UserId,您可以称之为UserFk)

在发布表中,您可以根据教授的id引用该教授,并将其称为ProfessorFk。这样可以在表之间创建非常高效的引用。发布表还获取单个PublicationId作为主键

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

关于创建组合键(Id、UserId)的教授键。我个人不喜欢组合键,如果你想从你的发布表中引用这个教授,你需要两列。 这也意味着你可以为同一个用户设置多个教授,如果是这样,选择单一Id选项

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

  • 用户表
    • 用户ID
  • 学生桌
    • 学生
    • UserFk
  • Table教授
    • 教授
    • UserFk
  • 教授出版表
    • FK教授
    • 出版物FK
  • 发布表
    • 出版物ID

因此,这部分是基于您希望如何处理数据,部分是基于您的偏好。

是的,这是一种1对1的关系,这就是我使用UserId作为PK的原因。这涵盖了。。。问题是,如果我应该有一个额外的列作为PK,那么其他表与这个表相关,ID为Professor,因此更明显的是,它只与Professor相关,而不是与用户表中的所有用户相关。我个人不会使用额外的空间使设计自我记录,虽然我当然能理解有人这么做。一个用户可以是不止一个教授吗,也就是说,教授身份是衡量用户教授多少门课程的尺度吗?用户可以同时是学生和教授吗?我建议在所有表中都使用主键。我还建议不要使用通用列ID作为每个表的主键。这有两个挑战,一个是名称完全不明确。第二个问题是列的名称在表之间发生变化,这是一个很难处理的问题。在每个表中使用UserID。学生和教授也一样。你的建议可能有道理,但在我的情况下,教授总是同一个用户。。。这是一种1对1的关系……教授表和学生表只是用户表的扩展。在这种情况下,出版物只能由教授撰写。