有两个表:
授权联系人(auth_contacts):
(
userid varchar
contacts jsonb
)
Run Code Online (Sandbox Code Playgroud)
contacts 包含具有属性的联系人数组 {contact_id, type}
discussion:
(
contact_id varchar
discussion_id varchar
discussion_details jsonb
)
Run Code Online (Sandbox Code Playgroud)
该表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"}]}'
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
这样做实际上是在运行时创建(内部sql)用户ID与联系人id表(这是我正在避免的,因此用于JSONB数据类型对于具有大记录的用户的此查询需要26 +秒,这并非全是好的.其他一些方法:PostgreSQL 9.4:在数组内的JSON字段id上的Aggregate/Join表
但应该有一个更简洁的更好的方式,就像JOIN一样简单.d.contact_id = …