来自同一个表的多个外键

时间:2014-06-16 12:10:23

标签: mysql sql database foreign-keys foreign-key-relationship

我正在建立一个毕业项目管理系统的数据库。学生分成小组。有小组桌子和教师桌子。每个小组都有一名顾问和两名审查员。我在这里很困惑。我应该从教师表中创建3个FK吗? 2为审查员,1为顾问?

这是SQL代码:

 create table groups
(
    groupID             NUMBER                not null,
    nbStudents          NUMBER                not null,
    avgGPA              DOUBLE                NOT NULL,
    projectName         varchar(50)           not null,
    advisorID           NUMBER                
    examiner1ID         NUMBER  
    examiner2ID         NUMBER  
    primary key (groupID)
);
create table faculty
(
    name                varchar(30)           not null,
    facultyID           NUMBER(10)            not null,
    email               varchar(30)           not null,
    mobile              NUMBER(15)            not null,
    type                varchar               
    primary key (facultyID)
);

alter table groups
    add constraint FK_EX1 foreign key (examiner1ID)
       references faculty (facultyID) ;
alter table groups
    add constraint FK_EX1 foreign key (examiner2ID)
       references faculty (facultyID) ;
alter table groups
    add constraint FK_EX1 foreign key (advisorID)
       references faculty (facultyID) ;

1 个答案:

答案 0 :(得分:0)

编辑待定......请参阅我的第一条评论。

只需在找到外键时说明。

外键表示表中列中的值必须显示为另一个(可能是相同的)表中列的值,其中相应的列构成键。因此,在给定的设计中,只要在找到它们时声明FK即可。

虽然这些并不是真正的FK。首先,在SQL中,FK声明实际上声明了一个外部超级键。其次,因为那些列可以为NULL。 SQL说它将如何检查它们,并且它不会检查列何时为NULL,这是你想要的。但这种约束只不是外国(超级)密钥。我们只是在SQL数据库中将其称为。<​​/ p>

查找描述应用程序位置的语句,然后进行规范化。

本身不具有多个列的非规范化。那是common misconception

然而,它至少对于理想的设计而言通常是禁忌的。只需查找由列名称参数化的参数化语句,即可了解有关情况的所有内容。每个语句都有一个表格。

// group [groupID] contains [nbStudents] students .... and has advisor [advisorID] and ...
groups(groupID,nbStudents,...,advisorID,examinerID)

使表达式为true的行进入表中。找到描述应用程序情况所需的所有语句。使用使其语句成立的行填充表。

查找简单语句并稍后重新排列NULL。

请注意,上述语句仅适用于没有NULL的行。但是你有时想说没有教师担任这些角色。

理想情况下,你只想要

// group [groupID] contains [nbStudents] students ... [projectName])
groups(groupID,nbStudents,...,projectName)
// [facultyID] advises [groupID]
advises(facultyID,groupID)
// [facultyID] examines [groupID]
examines(faculty,groupID)

对每组教师人数的限制。如果你正确地编写了一个没有空值的关系设计,那么规范化就会得到这种简单的东西。不要担心陈述/表格的数量。它们只反映了应用程序的复杂性。

但SQL DBMS通常不会轻易支持约束。因此,出于某些原因,我们可能会重新安排SQL或性能。但首先设计无空值。即选择直截了当的陈述&amp;然后规范化。然后重新安排。 (SOme重新排列可能会使标准化失效,但不是这种特殊情况。)

空虚复杂。

null的一个问题是它们使表的含义复杂化。使用null的设计具有表group,其中包含使此语句成立的行:

//*
    group [groupID] contains [nbStudents] students ....
AND (   [advisorID IS NULL  they have no advisor
    OR [advisorID] IS NOT NULL AND advisor [facultyID] advises them)
AND (   [examiner1ID IS NULL AND [examiner2ID] IS NULL and they have no examiner
    OR [examiner1ID] IS NOT NULL AND [examiner2ID] IS NULL AND [examiner1ID] examines them
    OR [examiner1ID] IS NULL AND [examiner2ID] IS NOT NULL AND [examiner2ID] examines them
    OR [examiner1ID] IS NOT NULL AND [examiner2ID] IS NOT NULL
       AND [examiner1ID] examines them AND [examiner2ID] examines them)
*//
groups(groupID,nbStudents,...,advisorID,examinerID)

除非在查询时将空值切换回上面的简单表,否则您的查询含义也会像这样复杂。即查询提供的行使得这样的语句成立。

最重要的是,当在SQL中留下空值时,会给出复杂的答案,意味着&#34; ...和教师未知&#34;。

人们可以直观地了解基表中的这些空值。但首先设计简单而健全。稍后重新排列。确保正确剪切无零件并在查询时保留无零件。