第一次尝试使用JSONB数据类型(从(从JSONB列中的值联接表开始)讨论@Erwin的意见,开始新线程)
两个表(混淆的数据和表名):
1. Discussion table { discussion_id int, contact_id, group_id, discussion_updates jsonb } [has around 600 thousand rows]
2. Authorization table {user_id varchar , auth_contacts jsonb, auth_groups jsonb} [has around 100 thousand rows]
auth_contacts jsonb data has key value pairs data (as example)
- {"CC1": "rr", "CC2": "ro" }
auth_groups jsonb data has key value pairs data (as example)
- {"GRP1": "rr", "GRP2": "ro" }
Run Code Online (Sandbox Code Playgroud)
1-首先,通过Java JDBC在数据库中插入:我正在做的是:
JSONObject authContacts = new JSONObject();
for(each record in data){
authContacts.put(contactKey, contactRight); …Run Code Online (Sandbox Code Playgroud) 有两个表:
授权联系人(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 = …