首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgresql对FK的约束

Postgresql对FK的约束
EN

Database Administration用户
提问于 2013-06-04 17:34:24
回答 2查看 98关注 0票数 2

我正在尝试设计一个( a)数据库,它必须完成以下工作:

  • 有一个students表,包含一群学生。
  • 数据库中有教育。
  • 每个学生都可以接受0.n的教育。
  • 有x种不同类型的教育,其中x是小的(<10),提前知道。
  • 不同类型的教育都有与之相关的相同类型的数据(地点、名称等)。
  • 一些更多的数据与学生与教育的联系有关(例如年级、开始日期等)。
  • 与学生教育联系相关的数据类型取决于教育类型(例如,硕士学位有专业,课程没有)。

我试图创建一个很好的数据库设计来表示这些数据,但是有相当多的困难。我想出的一个设计如下:

  • Student表,其中包含学生数据
  • Education表,它包含教育数据。有一个类型列来指定类型。
  • Student_Education连接表,它将学生与教育联系起来。
  • X <type>Education表,它将包含与学生教育连接相关的数据(因此,FK到Student_Education总是存在的)。每个教育类型都有自己的桌子。

但是,此设计存在一个问题:只有当教育类型匹配时,才允许<type>Education行引用Student_Education连接。例如,一个MasterEducation行只能引用Student_Education表中的一行,该行引用Education表中的一行并使用==主类型。

是否可以添加一个约束来检查这个约束呢?

如果没有,还有哪些其他选择可供选择?

EN

回答 2

Database Administration用户

发布于 2013-06-05 13:00:07

从设计的角度来看,为什么需要Student_Education表呢?

特定学生遵循某种类型教育的信息是由<type>Education表中相应行的存在所暗示的。

如果Student_Education's的原因是为了SQL,那么它可能是一个返回所有<type>Education表的联合的视图。

至于Education的外键,要确保<type>Education中的每个条目只能引用其对应的类型,我可以看到两个选项:

  1. 正如@Hyper多维数据集在注释中所建议的,添加一个具有固定值和表级外键的<type>Education.educ_type列:FOREIGN KEY (educ_id,educ_type) REFERENCES Education(unique_id,type)
  2. Education拆分成与教育类型相同的子表,并将列级外键从每个<type>Education.educ_id拆分到相应的子表。如果将来应该用特定于特定教育类型的列来扩展Education表,那么这也是正确的设计选择。Education也可以作为子表的联合视图,至少对于公共列是这样。
票数 2
EN

Database Administration用户

发布于 2013-06-04 19:23:10

为什么不将与Student_education连接相关的数据放到该表中呢?每种教育类型所保存的数据是否有很大的差异?我想基本上都是一样的。下面的模型不起作用吗?

代码语言:javascript
运行
复制
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
);
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/43813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档