Sql 一对多关系的复合主键?
嗯,我总是这样做:Sql 一对多关系的复合主键?,sql,postgresql,Sql,Postgresql,嗯,我总是这样做: create table language ( id bigserial primary key, code varchar(10) not null ); create table entity ( id bigserial primary key ); create table entity_description ( id bigserial primary key, language_id bigint not null, const
create table language (
id bigserial primary key,
code varchar(10) not null
);
create table entity (
id bigserial primary key
);
create table entity_description (
id bigserial primary key,
language_id bigint not null,
constraint fk__entity_description__language
foreign key language_id
references language(id),
entity_id bigint not null,
constraint fk__entity_description__entity
foreign key entity_id
references entity(id),
name varchar(20) not null
);
create table language (
id bigserial primary key,
code varchar(10) not null
);
create table entity (
id bigserial primary key
);
create table entity_description (
language_id bigint not null,
constraint fk__entity_description__language
foreign key language_id
references language(id),
entity_id bigint not null,
constraint fk__entity_description__entity
foreign key entity_id
references entity(id),
primary key (language_id, entity_id),
name varchar(20) not null
);
但是我想知道。。我为什么不这样做:
create table language (
id bigserial primary key,
code varchar(10) not null
);
create table entity (
id bigserial primary key
);
create table entity_description (
id bigserial primary key,
language_id bigint not null,
constraint fk__entity_description__language
foreign key language_id
references language(id),
entity_id bigint not null,
constraint fk__entity_description__entity
foreign key entity_id
references entity(id),
name varchar(20) not null
);
create table language (
id bigserial primary key,
code varchar(10) not null
);
create table entity (
id bigserial primary key
);
create table entity_description (
language_id bigint not null,
constraint fk__entity_description__language
foreign key language_id
references language(id),
entity_id bigint not null,
constraint fk__entity_description__entity
foreign key entity_id
references entity(id),
primary key (language_id, entity_id),
name varchar(20) not null
);
我的问题是
- 在第二个示例中,是否有任何东西与复合主键相反
- 有什么好处吗
- 在第二个示例中,
、(语言id,实体id)
和语言id
是否分别为表实体id
编制索引?如果我取实体描述
。。其中entity_description.id=x
比的获取速度慢。。其中(实体描述.language\u id,实体描述.entity\u id)=(x,y)
JOIN
中指定这两列),而且它实际上没有提供任何积极的好处……@DanBracuk很抱歉,时间太晚了。我编辑了我的示例,使其更有意义entity_details
现在是一个转换表。0)像这样的NxM连接表具有复合键(将关键元素视为强域)是很正常的。1) 主键约束自动在postgres中创建唯一索引。如果只指定了第一个键元素,也将使用索引。在大多数情况下,您还需要一个具有相反顺序的键元素的复合索引。@joop缺点当然是如果entity\u description
与另一个表有另一个m:n关系,则该连接表的主键至少为2+(其他表pk的大小)列:language\u id,entity\u id。你提到了pk的顺序:直到现在我都不知道这有什么不同,但这是有意义的。所以我想要的实际上是pk的字典顺序,例如单语言id通常是相同的,最好是有(实体id,语言id),而不是相反的方式。我说得对吗?