postgresql SQL中的自然组合键与单个代理键

fwzugrvs  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(120)
create table Section
(
    section_surr_id serial not null,
    curr_id int,
    section_id int not null,
    foreign key (curr_id) references Curriculum(curr_id)
);

create table Lesson
(
    lesson_surr_id serial not null,
    curr_id int,
    section_id int, 
    lesson_id int not null,
    uri varchar not null,
    title varchar not null,
    description varchar,
    foreign key (curr_id) references Curriculum(curr_id),
    foreign key (section_id) references Section(section)
);

字符串
下面是我想做的事情的大致概述:课程有许多部分;每个部分有许多课程
Lesson表中,我想包括section_id,因为每个课程都属于一个特定的部分;但是我已经为部分创建了一个代理键,它唯一地标识每个部分。
这样做的原因是每个课程都有许多部分,所以如果我把section_id作为主键,那么它可能会重复,就像课程1的第1部分和课程2的第1部分一样;因此我有两个选择:

  • 创建由curr_idsection_id组成的复合自然键
  • 或创建代理单列主键

现在我在第二课中引用什么键;,如果我引用代理键,那就不自然了,因为我必须寻找我想引用的部分的代理键,比如所需课程的1,2,3等。

plicqrtu

plicqrtu1#

有不止一个“正确”的答案,所以这是一个基于观点的问题,Stack Overflow不鼓励这样做。
我会创建一个复合主键。

create table Section
(
    curr_id int not null,
    section_id int not null,
    primary key (curr_id, section_id),
    foreign key (curr_id) references Curriculum(curr_id)
);

字符串
然后用一个复合外键引用它。固执己见的部分是,一个人可以在Lesson表中保留串行键,或者不。以下任一项都是正确的:

create table Lesson
(
    lesson_surr_id serial not null,
    curr_id int not null,
    section_id int not null, 
    lesson_id int not null,
    uri varchar not null,
    title varchar not null,
    description varchar,
    foreign key (curr_id, section_id) references Section(curr_id, section_id)
);

create table Lesson
(
    curr_id int not null,
    section_id int not null, 
    lesson_id serial not null,
    uri varchar not null,
    title varchar not null,
    description varchar,
    primary key (curr_id, section_id, lesson_id),
    foreign key (curr_id, section_id) references Section(curr_id, section_id)
);


这取决于个人喜好。

相关问题