引用不同表格行的列中的ID数组

时间:2017-06-24 05:12:31

标签: sql postgresql

假设我有一个包含不同类别的表..然后是另一个表,其中列必须引用第一个类别中多个类别的数组。

这叫做什么,最好的方法是什么?

Postgres Dialect:)

Category Id | Category Name
1           | Category 1
2           | Category 2

Product Id | Product Name | Categories
1          | Product 1    | 1,2

1 个答案:

答案 0 :(得分:3)

它只被称为整数数组int[](如果需要8字节整数,则为int8[]。)

create table category (
  id serial primary key,
  name text not null
);

create table product (
  id bigserial primary key,
  name test not null,
  category_ids int[] not null
);

你可以使用这种方法甚至在product.category_ids上添加GIN索引来加速select * from product where '{2}'::int[] <@ category_ids;之类的查找 - 但是明显的缺点是Postgres无法确保参照完整性 - 你无法为int[]定义外键。

或者,您可以使用jsonb数据类型而不是int[],并在该列上添加GIN索引以加快搜索速度。

如果你想拥有FK(这是非常好的和正确的愿望),只需遵循传统方法,EAV:

create table category (
  id serial primary key,
  name text not null
);

create table product (
  id bigserial primary key,
  name test not null
);

create table product2category (
  product_id int8 not null references product(id),
  category_id int not null references category(id),
  primary key (product_id, category_id)
);

有很多文章发现EAV与int[](又名&#34; intarray&#34;)或jsonb方法的优缺点,其中之一是:{{3 - 我建议谷歌该主题并学习,这将有助于确定哪些更适合您的情况。