小编Pra*_*thi的帖子

带有JAVA的JSONB PostgreSQL数据类型-插入和联接

第一次尝试使用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)

java json postgresql-performance jsonb postgresql-9.4

5
推荐指数
0
解决办法
2915
查看次数

使用JSONB列中的值连接表

有两个表:

授权联系人(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 = …

sql jsonb postgresql-9.4

2
推荐指数
1
解决办法
1万
查看次数

标签 统计

jsonb ×2

postgresql-9.4 ×2

java ×1

json ×1

postgresql-performance ×1

sql ×1