繁体   English   中英

如何实现双向引用表?

[英]How to implement bidirectional referenced tables?

我有一桌学校和一桌老师,有一对多的关系。 但是,一位老师是学校的原则,只有一位老师可以是学校的原则。 因此,我想到将“教师ID”(原则)保存在“学校”表中,如下所示:

CREATE TABLE School (
    ID INT PRIMARY KEY,
    Name VARCHAR(40),
    PrincipleID INT FOREIGN KEY REFERENCES Teacher.ID
)

CREATE TABLE Teacher (
    ID INT PRIMARY KEY,
    Name VARCHAR(40),
    SchoolID INT FOREIGN KEY REFERENCES School.ID
)

我知道我可以在学校表中松开外键引用,但这不是一种选择。

建立表格后,我应该做参考吗? 如果是,怎么办?

另一个解决方案是创建一个新表,假设SchoolsPrinciples仅包含两个字段:

CREATE TABLE SchoolsPrinciples
(
  SchoolId int,
  TeacherId int,
  CONSTRAINT uc_SchoolTeacher UNIQUE (SchoolId, TeacherId)
)

UNIQUE约束使您每所学校都能获得一位真正的老师。

构建表时,您需要将约束添加为单独的alter语句。 还要注意,在创建外键时,您仅应指定表名,而不是所引用的列(该列由主键隐含)。

CREATE TABLE School (
    ID INT PRIMARY KEY,
    Name VARCHAR(40),
    PrincipleID INT);

CREATE TABLE Teacher (
    ID INT PRIMARY KEY,
    Name VARCHAR(40),
    SchoolID INT 
      CONSTRAINT FK_Teacher_School 
      FOREIGN KEY REFERENCES School);

ALTER TABLE School add
    CONSTRAINT FK_School_Teacher 
    FOREIGN KEY (PrincipleID) REFERENCES Teacher;

添加数据时,您需要将PrincipleIDID字段设置为单独的更新:

insert into School (ID, Name)
values (1, 'Blarg Elementary');

insert into Teacher (ID, Name, SchoolID)
values (1, 'John Doe', 1),
       (2, 'Bob Smith', 1),
       (3, 'Adam Walker', 1);

update School set PrincipleID = 2 where ID = 1;

而是将布尔IsPrincipal放置在Teacher表上。 或添加第三个关系表

CREATE TABLE SchoolPrincipals (
  INT SchoolID PRIMARY KEY FOREIGN KEY REFERENCES School.ID,
  INT TeacherID FOREIGN KEY REFERENCES Teacher.ID
)

使所有内容保持整洁而无需痛苦的删除逻辑。

您可以将“教师”表中的列作为

  1. IsPrincipal ,其中只有一行具有jonnyGold所引用的true值,

      This can be checked by triggers. OR You can use filtered index if using Sql Server 2008. Create unique filtered index where SchoolID, IsPrincipal is NOT NULL and are unique 
  2. 老板将在其中包含校长ID,因此创建了您不适合的employee manager relationship

创建表EmpManager(TeacherID int SchoolID int IsPrincipal位)并使用过滤的索引或触发器来处理场景。

编辑:

CREATE TABLE [dbo].[Teacher](
    [ID] [int] NOT NULL primary key,
    [Name] [varchar](40) NULL,
    [SchoolID] [int] NULL,
) 
GO

CREATE TABLE [dbo].[School](
    [ID] [int] NOT NULL primary key,
    [Name] [varchar](40) NULL,
    [PrincipleID] [int] NULL,
)
GO

ALTER TABLE [dbo].[Teacher]  WITH CHECK ADD  CONSTRAINT [FK_Teacher_School] FOREIGN KEY([SchoolID])
REFERENCES [dbo].[School] ([ID])
GO

ALTER TABLE [dbo].[School]  WITH CHECK ADD  CONSTRAINT [FK_School_Teacher] FOREIGN KEY([PrincipleID])
REFERENCES [dbo].[Teacher] ([ID])
GO

在此处输入图片说明

ADC建议采用更好的设计

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM