【问题标题】:Postgresql column type performancePostgresql 列类型性能
【发布时间】:2020-11-11 10:34:08
【问题描述】:

所以,假设我需要创建一个表。其中一列将包含一个字符串数组,例如别人买的水果。现在,我需要进行查找,例如谁买了哪种水果。苹果等。现在,我可以为列选择两种数据类型:

  1. Json 类型

    通过这种方法,该列将存储 JSON 对象并使用 POSTGRESQL json 运算符来检查水果的存在。

  2. 字符串类型

    这样,我们连接每个水果,例如“苹果橙葡萄”。要检查是否存在,我们可以使用 LIKE 函数或任何其他字符串匹配函数。

虽然我没有对自己进行基准测试,但我想从专家那里知道哪种方法是最好的。让我们假设对于任何行,水果的数量不会超过 200。我们也会得到更新,但这些更新并不那么频繁。我们很可能会收到比更新更多的查询。

【问题讨论】:

  • 没有一种方法是好的。按照@GMB 建议的方式走,这是迄今为止最好的。此外,桥牌桌可能还有额外的属性——购买时间、数量、价格等。

标签: sql database postgresql database-design


【解决方案1】:

我建议标准化您的设计。我建议不要在单个列中存储多个值(作为 JSON 或作为分隔字符串),而是创建另一个表,称为桥表,其中每个用户/水果将存储在单独的行中。

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
);

这是在关系数据库中存储多对多关系的规范方式(一个用户可能有几个水果,一个水果可能属于多个用户)。

然后,您可以使用以下查询轻松有效地查找所有拥有水果“苹果”的用户:

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'
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2019-04-13
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多