Postgresql 列类型性能
Postgresql column type performance
所以,假设我需要创建一个 table。其中一列将包含一个字符串数组,例如有人买的水果。现在,我需要执行查询,比如谁买了哪种水果,例如苹果等。现在,我可以为该列选择两种数据类型:
Json类型
使用这种方法,该列将存储 JSON 对象并使用 POSTGRESQL json 运算符来检查是否存在水果。
字符串类型
有了这个,我们连接每个水果,例如“苹果橙葡萄”。要检查是否存在,我们可以使用 LIKE 函数或任何其他字符串匹配函数。
虽然我没有对自己进行基准测试,但我想从专家那里了解哪种方法是最好的。让我们假设对于任何一行,水果的数量都不会超过 200。我们也会得到更新,但更新频率并不高。我们很可能会收到比更新更多的查询。
我建议规范化您的设计。我建议创建另一个 table,称为桥 table,其中每个 user/fruit 将存储在单独的行中。
create table users (
user_id serial primary key,
name text
);
create table fruits (
fruit_id serial primary key,
name text
);
create table users_fruits (
user_id int references users(user_id) on delete cascade,
fruit_id int references fruits(fruit_id) on delete cascade
);
这是关系数据库中存储多对多关系的规范方式(一个用户可能有多个水果,一个水果可能属于多个用户)。
然后,您可以使用如下查询轻松高效地查找所有拥有水果“apple”的用户:
select u.*
from users u
where exists (
select 1
from users_fruits uf
inner join fruits f on f.fruit_id = uf.fruit_id
where uf.user_id = u.user_id and f.name = 'apple'
)
所以,假设我需要创建一个 table。其中一列将包含一个字符串数组,例如有人买的水果。现在,我需要执行查询,比如谁买了哪种水果,例如苹果等。现在,我可以为该列选择两种数据类型:
Json类型
使用这种方法,该列将存储 JSON 对象并使用 POSTGRESQL json 运算符来检查是否存在水果。
字符串类型
有了这个,我们连接每个水果,例如“苹果橙葡萄”。要检查是否存在,我们可以使用 LIKE 函数或任何其他字符串匹配函数。
虽然我没有对自己进行基准测试,但我想从专家那里了解哪种方法是最好的。让我们假设对于任何一行,水果的数量都不会超过 200。我们也会得到更新,但更新频率并不高。我们很可能会收到比更新更多的查询。
我建议规范化您的设计。我建议创建另一个 table,称为桥 table,其中每个 user/fruit 将存储在单独的行中。
create table users (
user_id serial primary key,
name text
);
create table fruits (
fruit_id serial primary key,
name text
);
create table users_fruits (
user_id int references users(user_id) on delete cascade,
fruit_id int references fruits(fruit_id) on delete cascade
);
这是关系数据库中存储多对多关系的规范方式(一个用户可能有多个水果,一个水果可能属于多个用户)。
然后,您可以使用如下查询轻松高效地查找所有拥有水果“apple”的用户:
select u.*
from users u
where exists (
select 1
from users_fruits uf
inner join fruits f on f.fruit_id = uf.fruit_id
where uf.user_id = u.user_id and f.name = 'apple'
)