Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 一对多关系的复合主键?_Sql_Postgresql - Fatal编程技术网

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)

我的问题是,“为什么需要两个表?”如果两列中只有一列已经是候选键(例如,唯一且可靠地标识每一行),那么让PK由两列组成没有任何好处。在索引中添加第二列有什么好处?这只会使从其他表引用该表变得更加困难(在这些表中,复合PK中必须有两列,并且必须始终在任何
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),而不是相反的方式。我说得对吗?