假设我有一个包含不同类别的表..然后是另一个表,其中列必须引用第一个类别中多个类别的数组。
这叫做什么,最好的方法是什么?
Postgres Dialect:)
Category Id | Category Name
1 | Category 1
2 | Category 2
Product Id | Product Name | Categories
1 | Product 1 | 1,2
答案 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 - 我建议谷歌该主题并学习,这将有助于确定哪些更适合您的情况。