PostgreSQL - 是jsonb_set()性能O(1)?

时间:2017-01-10 18:14:26

标签: json postgresql jsonb

我正在构建一个社交网络,并尝试实现一个数据结构,以便为每个用户保存时间线事件ID。我受Redis Twitter Clone的启发,并使用了Redis Lists。

例如,对于user_id 45,在其Feed中有事件ID:33,55,89 ......我们将在Redis中使用 key:45,value:List with(33,55,89 ...)

我想在PostgreSQL中有一个类似的模型。我创建了一个带有列的表:
user_id:bigint和event_ids:jsonb。所以我的表格看起来像:

45, [33,55,89...]

所以我需要的命令:

UPDATE timeline_for_user 
    SET event_ids = jsonb_set(event_ids, '{0}', EVENT_ID, true);  

这将EVENT_ID放在数组的开头(索引0)。

我的第一个问题:此更新是否在O(1)时间内“到位”发生?意思是,整个数组不会先读入内存吗?

我需要的另一个命令是从数组中分页ID,如下所示:

select jsonb_array_elements(event_ids) 
from timeline_for_user 
where user_id=55
OFFSET 10
limit 10    
  1. 这里是否将整个数组读入内存?

  2. 关于另外两个问题,在查看一个相当繁忙的社交网站的场景时,假设数组中有大约1000个ID,以及大量的插入和查询,这个解决方案会支持吗?有没有人遇到过这种情况或类似情况?

1 个答案:

答案 0 :(得分:0)

这里不需要使用JSONB,Postgres has arrays。对于fixed size data like integers the performance of arrays will be O(1)。因此,您要将事件声明为integer[]

但是,能力关系是SQL数据库的核心。相反,请考虑为用户的事件创建连接表。

create table user_events (
    user_id integer references users(id),
    event_id integer references events(id),
    created_at datetime
);

create index on user_events (datetime);

现在你可以对它们进行分页。

select event_ids
from user_events
where user_id=55
order by created_at
offset 10
limit 10 

哪个会表现得更好,我不确定。你必须做一些测试。但该指数对于获得良好的业绩至关重要。