我正在构建一个社交网络,并尝试实现一个数据结构,以便为每个用户保存时间线事件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
这里是否将整个数组读入内存?
关于另外两个问题,在查看一个相当繁忙的社交网站的场景时,假设数组中有大约1000个ID,以及大量的插入和查询,这个解决方案会支持吗?有没有人遇到过这种情况或类似情况?
答案 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
哪个会表现得更好,我不确定。你必须做一些测试。但该指数对于获得良好的业绩至关重要。