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 个帖子进行多次查询,然后将它们合并到应用程序层中。
这将是最有效的,因为所有记录都将在写入时在磁盘和内存中排序。
[问题 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 个帖子进行多次查询,然后将它们合并到应用程序层中。
这将是最有效的,因为所有记录都将在写入时在磁盘和内存中排序。