Table YugabyteDB 中社交应用的布局

Table layout for social app in YugabyteDB

[问题 post 由用户在 YugabyteDB Community Slack]

上提出

我想看看我们是否可以使用 YB 的二级索引来避免数据反规范化,主 table 如下所示:

CREATE TABLE posts_by_user(
    user_id   bigint,
    post_id     bigserial,
    group_ids   bigint[] null,
    tag_ids     bigint[] null,
    content     text null,
    ....
    PRIMARY KEY (user_id, post_id)
)

-- 可以有多个组 ID(最多 20 个),用户可以 select 发布 his/her post in

-- 可以有多个标签 ID(最多 20 个),用户可以 select 发布 his/her post 和

这种结构使得通过 user_id 获取更容易,但是,假设我想通过 group_id(s) 或 tag_id(s) 获取,那么我将需要取消-使用 YB 事务将其规范化为辅助 tables,这将需要额外的应用程序逻辑并且还可能导致性能问题,因为数据将被写入基于散列主键的多个节点(group_ids 和 tag_ids)。 或者我可以使用二级索引来避免编写额外的逻辑,我对此有以下疑问: YB stable 版本 2.8 不允许使用 GIN 在数组列上创建二级索引,任何粗略的时间表它将作为 stable 发布版本提供? 这是否也会遇到同样的性能问题,因为多个索引将在基于分区键 group_id(s) 或 tag_id(s) 的多个节点中的客户端调用时更新? 其他想法也很受欢迎,可以保存数据以以可扩展的方式基于 user_id(s)、group_id(s)、tag_id(s) 实现更快的查询。

GIN 索引的问题是它不会按时间戳在磁盘上排序。

您必须为 (user_id, datetime desc) 创建索引。 而对于组,您可以维护一个单独的 table,主键为 (group_id desc, datetime desc, post_id desc)。标签也一样。 在每个 feed-request 上,您可以对每个 user_id 或 group_id 上的 5 个帖子进行多次查询,然后将它们合并到应用程序层中。

这将是最有效的,因为所有记录都将在写入时在磁盘和内存中排序。