我正在使用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"进入课程表中的允许字段。
答案 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。
另外,不要使用字符串作为主键;他们表现不佳。如果您想要一个用于显示目的的短标识符,请将其设置为单独的列并在其上添加唯一约束。