我正在为学校管理系统设计一个数据库。数据库将保存多所学校的数据。我正在设计的表正在形成循环引用。它看起来像这样:
学校 - SchoolId(Pk),SchoolName,RegistrationNo,.....
Department - DeptId(Pk),SchoolId(Fk),DeptName,...
老师 - TeacherId(Pk),DeptId(Fk),SchoolId(Fk),姓名,....
学校将有不同的部门和教师。教师将属于特定部门。
如何避免此循环引用..
任何帮助/建议将不胜感激.. 感谢
答案 0 :(得分:1)
你应该删除引用SchoolId的教师FK,因为有了教师,你可以通过FK访问他的学校到部门表。
然而,正如The Unbeliever所说,这不是循环引用,只是归一化错误。
答案 1 :(得分:1)
好的,所以(基于你的评论)我们的情况并非所有教师都属于部门。有两种方法可以对此进行建模。
首先是在SchoolId
中使DeptId
和Teacher
都可以为空,并且有一个检查约束,确保其中一列完全不为空。因此,一个没有部门的老师有一个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)
)
处理此问题的第二种方法是在Department
和DeptId
上的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 */
)