从2个外键

时间:2016-04-08 19:50:10

标签: sql sql-server sql-server-2014

我正在使用Microsoft SQL Server 2014。

我们说我有一个有3张桌子的大学数据库。一个列出课程,一个是年,一个是可以做的课程。

CREATE TABLE Courses (
    Course_ID varchar(5) PRIMARY KEY NOT NULL,
    Name varchar(255) NOT NULL
)

CREATE TABLE Years (
    Year_ID tinyint
)

CREATE TABLE Coursework (
    CW_ID varchar(5) PRIMARY KEY NOT NULL,
    Name varchar(255) NOT NULL,
    Allowed varchar(255) NOT NULL
)

现在,可以允许任何课程/年的课程作业。所以,我可以开设一个课程,让学生在第一年的课程X,另一个允许学生在第2年和第3年的课程X,Y和Z,一个允许学生在所有年份的课程X,一个允许学生在第1年和第2年,无论当然,甚至是一个允许所有课程和所有年份。 (我希望这能说明我的观点。)

"允许"可以通过引用每个表的外键(课程和年份)来验证组合是否有效。

但我该怎么做?我曾想过使用复合主键创建一个新表,但这需要手动输入,并且它将被限制为成对组合。

所以我的猜测是我需要以某种方式生成可能的组合,将它们列在一个表中,每个表都有一个唯一的主键,并在" Coursework"中引用它作为外键。表。但是,我有点卡住了。有什么提示吗?

编辑:

澄清我想要的东西:

想象一下以下课程表:

Course_ID    Name

A            Arithmetics
B            Biology
C            Chemistry

以下几年表:

Year_ID

1
2
3

现在,老师创建了一个新的课程。他们希望在2年级或3年级的学生中学习生物学或化学。因此,有人可以在第3年学习生物学,有人在第2年学习化学,但不会在第1年学习生物学或第2年学习算术的人。

他们会将课程作业插入表格。

CW_ID    Name             Allowed

SA       Soil analysis    B,C,2,3

这没关系,但我如何检查他们是否正在输入存在的值,以阻止他们输入" X,5"例如,因为这样的课程/年不存在?

EDIT2:

我正在测试一些东西,但除了它绝对不是最好的解决方案之外,我甚至不确定如何实现它。

CREATE TABLE YesOrNo (
    YesOrNo_ID bit PRIMARY KEY NOT NULL
)

CREATE TABLE Allowed (
    Allowed_ID int IDENTITY(1,1),
    Arithmetics bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
    Biology bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
    Chemistry bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
    First bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
    Second bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
    Third bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL
)

通过在所有课程/年中填充带有1和0(真或假)的所有组合的允许表,教师只需要在课程表中插入Allowed_ID,然后将知道哪些课程/多年来课程作业被允许。

但是,手动添加所有课程和年份作为属性是不切实际的,即便如此,我也不知道如何自动填充表格。

从示例中可以看出,其中一个表格的行如下所示:

Allowed_ID    Arithmetics    Biology    Chemistry    First    Second    Third

42            0              1          1            0        1         1

老师只会输入" 42"进入课程表中的允许字段。

1 个答案:

答案 0 :(得分:0)

您想要多个连接表,而不是单个列,以记录哪些工作对哪些课程和年份有效。

CREATE TABLE ValidCourseworkByYear (
    VCWBY_ID int PRIMARY KEY IDENTITY(1,1),
    CW_ID varchar(5) NOT NULL,
    Course_ID varchar(5) NOT NULL,
    Year_ID tinyint NOT NULL
)

这会在工作,课程和年份之间创建链接,而不会复制数据或防止数据被多次使用。如果该表中不存在该条目,则该特定工作年级组合无效。

如果你的课程作业表已经被外键加入课程(意味着一件作品只能在一门课程中使用),那么你可以从这张表中删除CW_ID。

另外,不要使用字符串作为主键;他们表现不佳。如果您想要一个用于显示目的的短标识符,请将其设置为单独的列并在其上添加唯一约束。