我正在尝试设计一个( 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
复制相似问题