我应该在更新的数据模型中使用hstore吗?[英] Should I use hstore in renewed data model?

本文是小编为大家收集整理的关于我应该在更新的数据模型中使用hstore吗?的处理方法,想解了我应该在更新的数据模型中使用hstore吗?的问题怎么解决?我应该在更新的数据模型中使用hstore吗?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

在我的旧数据库(Postgres 9.1)中,我有几个包含不同类型文档的表(假设它们是"父"表).此外,还有一个表格,其中包含这些文档的各种参数:

create table params (
    kind integer,
    docid integer,
    parname text,
    parvalue text,
    constraint params_pk primary key (kind, docid, parname));

一个文档可能有很多 (parname, parvalue) 对.由于 kind 指向不同的表,它不能用作外键.

它多年来一直运行良好,因为 params 仅用于打印文档.现在,该表包含 500 万行,并且还需要这些数据用于其他目的.所以是时候更新这个模型了.

params 基本上只为一个文档插入一次,并且很少更新.它们将作为一个整体阅读(对于文档).无需搜索特定的 parname.

我有三个想法:

变体 A.根据父表将表params拆分成多个表,并使用docid作为外键.

变体 B.将表 params 拆分为变体 A 并将 (parname, parvalue) 存储为 hstore.

变体 C.在每个父表中添加一个 hstore 字段并忘记其他表.

我没有使用 hstore 的经验.每个变体的优缺点是什么?你会选哪一个?hstore 可以用一些奇怪的东西让我感到困惑吗?

推荐答案

我投票给第三个选项.桌子越少,睡眠越好.

Hstore 是为一级参数列表而发明的.它稳定、快速、简单,完全符合您的需求.前段时间我有类似的任务.我写了一个聚合以便于转换.

create or replace function hstore_add(hstore, text, text)
returns hstore language plpgsql 
as $$
begin
    return case
        when $1 isnull then hstore($2, $3)
        else $1 || hstore($2, $3) end;
end $$;

create aggregate hstore_agg (text, text) (
    sfunc = hstore_add,
    stype = hstore
);

我认为这可以节省您的时间.

select kind, docid, hstore_agg(parname, parvalue)
from params
group by 1, 2
order by 1, 2;

本文地址:https://www.itbaoku.cn/post/1764080.html