有两个表:
授权联系人(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 的聚合/连接表
但应该有一种更干净、更好的方法,就像这样简单
加入d.contact_id = contacts -> contact -> contact_id?
当我尝试这样做时,它不会产生任何结果。
当在网上搜索时,这似乎是一个相当麻烦的任务?