我正在尝试设计一个( a)数据库,它必须完成以下工作:
students表,包含一群学生。我试图创建一个很好的数据库设计来表示这些数据,但是有相当多的困难。我想出的一个设计如下:
Student表,其中包含学生数据Education表,它包含教育数据。有一个类型列来指定类型。Student_Education连接表,它将学生与教育联系起来。<type>Education表,它将包含与学生教育连接相关的数据(因此,FK到Student_Education总是存在的)。每个教育类型都有自己的桌子。但是,此设计存在一个问题:只有当教育类型匹配时,才允许<type>Education行引用Student_Education连接。例如,一个MasterEducation行只能引用Student_Education表中的一行,该行引用Education表中的一行并使用==主类型。
是否可以添加一个约束来检查这个约束呢?
如果没有,还有哪些其他选择可供选择?
发布于 2013-06-05 13:00:07
从设计的角度来看,为什么需要Student_Education表呢?
特定学生遵循某种类型教育的信息是由<type>Education表中相应行的存在所暗示的。
如果Student_Education's的原因是为了SQL,那么它可能是一个返回所有<type>Education表的联合的视图。
至于Education的外键,要确保<type>Education中的每个条目只能引用其对应的类型,我可以看到两个选项:
<type>Education.educ_type列:FOREIGN KEY (educ_id,educ_type) REFERENCES Education(unique_id,type)。Education拆分成与教育类型相同的子表,并将列级外键从每个<type>Education.educ_id拆分到相应的子表。如果将来应该用特定于特定教育类型的列来扩展Education表,那么这也是正确的设计选择。Education也可以作为子表的联合视图,至少对于公共列是这样。发布于 2013-06-04 19:23:10
为什么不将与Student_education连接相关的数据放到该表中呢?每种教育类型所保存的数据是否有很大的差异?我想基本上都是一样的。下面的模型不起作用吗?
CREATE TABLE Education_Types
(
id integer primary key,
name varchar(20),
details varchar(30)
);
CREATE TABLE Educations
(
id integer primary key,
name varchar(20),
education_type_id integer references Education_Types(id),
details varchar(30)
);
CREATE TABLE Students
(
id integer primary key,
first_name Varchar(1000),
last_name varchar(1000),
gender char(1),
SSN varchar(100)
);
CREATE TABLE Student_Education
(
id integer primary key,
student_id integer references Students (id),
educationId integer references Educations (id),
grade_point_avg decimal,
detail_1 varchar(1000) NULL,
detail_2 varchar(1000) NULL,
detail_3 varchar(1000) NULL,
detail_4 varchar(1000) NULL,
detail_5 varchar(1000) NULL,
start_date date,
end_date date
);https://dba.stackexchange.com/questions/43813
复制相似问题