表格形成循环参考

时间:2014-03-12 07:51:00

标签: sql-server-2008 database-normalization

我正在为学校管理系统设计一个数据库。数据库将保存多所学校的数据。我正在设计的表正在形成循环引用。它看起来像这样:

学校 - SchoolId(Pk),SchoolName,RegistrationNo,.....

Department - DeptId(Pk),SchoolId(Fk),DeptName,...

老师 - TeacherId(Pk),DeptId(Fk),SchoolId(Fk),姓名,....

学校将有不同的部门和教师。教师将属于特定部门。

如何避免此循环引用..

任何帮助/建议将不胜感激.. 感谢

2 个答案:

答案 0 :(得分:1)

你应该删除引用SchoolId的教师FK,因为有了教师,你可以通过FK访问他的学校到部门表。

然而,正如The Unbeliever所说,这不是循环引用,只是归一化错误。

答案 1 :(得分:1)

好的,所以(基于你的评论)我们的情况并非所有教师都属于部门。有两种方法可以对此进行建模。

首先是在SchoolId中使DeptIdTeacher都可以为空,并且有一个检查约束,确保其中一列完全不为空。因此,一个没有部门的老师有一个SchoolId,一个部门的老师只有一个DeptId

CREATE TABLE Teacher (
    TeacherID float not null primary key,
    DeptId float null,
    SchoolId float null,
    constraint CK_Teacher_School_or_Dept CHECK (
         (DeptId is null and SchoolId is not null) or
         (DeptId is not null and SchoolId is null)
    ),
    constraint FK_Teacher_School FOREIGN KEY (SchoolID)
          references School (SchoolID),
    constraint FK_Teacher_Dept FOREIGN KEY (DeptId)
          references Department (DeptId)
)

处理此问题的第二种方法是在DepartmentDeptId上的SchoolId中添加唯一键约束,然后在两者上应用外键Teacher到Department的这些列的em>。当DeptId为null时,不检查此外键约束,因此一切正常。如果DeptId不为空,则会强制SchoolId Teacher列与部门中的SchoolId匹配。

CREATE TABLE Department (
    DeptId float not null primary key,
    SchoolId float not null,
    constraint FK_Department_Schools FOREIGN KEY (SchoolId)
          references School (SchoolID),
    constraint UQ_Departement_WithSchool UNIQUE (DeptId,SchoolID)
)

CREATE TABLE Teacher (
    TeacherID float not null primary key,
    DeptId float null,
    SchoolId float not null,
    constraint FK_Teacher_School FOREIGN KEY (SchoolID)
          references School (SchoolID),
    constraint FK_Teacher_Dept FOREIGN KEY (DeptId,SchoolID)
          references Department (DeptId,SchoolID)
    /* Optional - still have the FK on just DeptID if you think it
       better documents the "real" relationship */
)