如何在 Postgres table 中插入一个具有一个键的 hstore 值和一个值数组作为对应值?

How to insert in a Postgres table, a hstore value having one key and an array of values of as corresponding value?

所以我必须在Postgres中创建一个table来存储图像上显示的table的内容(events_logs)。我发现我应该为 PARAMS 列使用 hstore 类型并且一切都很好,除了第三行,其中键链接到一个数组而不是像其他的那样的字符串。

这是我使用的脚本,第三行数据插入出现语法错误:

CREATE TABLE events_logs(      
          EVENT_DATE timestamp without time zone NOT NULL,
          USER_ID VARCHAR(25) NOT NULL,
          EVENT_ID integer NOT NULL,
          EVENT_VALUE NUMERIC,
          PARAMS hstore,
          PRIMARY KEY (EVENT_DATE,USER_ID,EVENT_ID),
          CONSTRAINT events_logs_event_id_fkey FOREIGN KEY (EVENT_ID)
              REFERENCES events (EVENT_ID) MATCH SIMPLE
              ON UPDATE NO ACTION ON DELETE NO ACTION
);

INSERT INTO events_logs (EVENT_DATE,USER_ID,EVENT_ID,EVENT_VALUE,PARAMS) VALUES
('2017-09-13 12:01:00','aed-355-dg25',3,NULL,''),
('2017-09-13 12:05:00','aed-355-dg25',2,NULL,'term => [“lamp”, “blue”]'),
('2017-09-13 12:06:00','ryf-734-em0',3,NULL,''),
('2017-09-13 12:08:00','ryf-734-em0',2,NULL,'term => “rug”');

我也尝试了 term => {“lamp”, “blue”}term => ARRAY[“lamp”, “blue”] 以及我从各个论坛获得的变体,但其中 none 给了我预期的结果。

所以我的问题是:

是否可以将元素数组关联到 hstore 值中的单个键?

有没有比hstore更适合这个需求的类型?

Is there a type that is a better fit for this requirement other than hstore?

是:jsonb - 它的额外好处是它是内置类型,不需要使用 CREATE EXTENSION。

在这种情况下,您的 INSERT 应该如下所示:

INSERT INTO events_logs 
  (EVENT_DATE,USER_ID,EVENT_ID,EVENT_VALUE,PARAMS) 
VALUES
  ('2017-09-13 12:01:00','aed-355-dg25',3,NULL,''),
  ('2017-09-13 12:05:00','aed-355-dg25',2,NULL,'{"term": ["lamp", "blue"]}'),
  ('2017-09-13 12:06:00','ryf-734-em0',3,NULL,''),
  ('2017-09-13 12:08:00','ryf-734-em0',2,NULL,'{"term": "rug"}');

或者简单地存储没有 term 关键字的参数和一个简单的数组:例如'["lamp", "blue"]''["rug"]'。我总是将列表参数存储为一个数组,即使它只是一个值。它使访问元素更容易,因为您不需要区分单个值和多个值。

如果这总是只是一个键列表,你也可以考虑一个原生数组:text[]