有两个表:
授权联系人 ( auth_contacts
):
(
userid varchar
contacts jsonb
)
contacts
包含具有属性的联系人数组{contact_id, type}
discussion
:
(
contact_id varchar
discussion_id varchar
discussion_details jsonb
)
该表auth_contacts
至少有 100k 条记录,因此它不是 JSONB 类型是不合适的,因为它会使记录量增加一倍或三倍。
样本数据auth_contacts
:
userid | contacts
'11111' | '{"contact": [{"type": "type_a", "contact_id": "1-A-12"}
, {"type": "type_b", "contact_id": "1-A-13"}]}'
discussion
表有 500 万条奇数记录。
我想加入discussion.contact_id
(关系列)与联系人 id,其中 json 对象数组中的 json 对象auth_contacts.contacts
。
一种非常粗暴的方法是:
SELECT *
FROM discussion d
JOIN (SELECT userid, JSONB_OBJECT_KEYS(a.contacts) AS auth_contact
FROM auth_contacts a) AS contacts
ON (d.contact_id = contacts.auth_contact::text)
这实际上是在运行时创建(内部 sql)用户 ID 与联系人 ID 表(这是我所避免的,因此使用 JSONB 数据类型对于具有大量记录的用户的此查询需要 26 + 秒,这并不是很好。试过其他一些方法:PostgreSQL 9.4:在数组内的 JSON 字段 id 上聚合/连接表
但是应该有一种更清洁、更好的方法,就像 JOIN 一样简单d.contact_id = contacts -> contact -> contact_id?
当我尝试这个时,它不会产生任何结果。
在网上搜索时,这似乎是一项相当繁琐的任务?