【发布时间】:2023-04-10 13:24:01
【问题描述】:
我正在创建一个社交网络应用程序,并且我已经对数据进行了非规范化,将时间线创建为包含所有字段的帖子列表,以便仅使用一个查询。问题是,如果每个帖子都有计数器(喜欢、分享、cmets),那么每次更新计数器时,如何同步时间轴中的所有帖子记录?或者我应该在时间线中只有 id,所以我只更新一个帖子表,时间线查询由两个查询而不是一个查询组成?
谢谢你
【问题讨论】:
我正在创建一个社交网络应用程序,并且我已经对数据进行了非规范化,将时间线创建为包含所有字段的帖子列表,以便仅使用一个查询。问题是,如果每个帖子都有计数器(喜欢、分享、cmets),那么每次更新计数器时,如何同步时间轴中的所有帖子记录?或者我应该在时间线中只有 id,所以我只更新一个帖子表,时间线查询由两个查询而不是一个查询组成?
谢谢你
【问题讨论】:
我一直在考虑类似的任务,这是我的想法:
时间线数据必须同步。在时间线中仅存储一个 id 并在帖子中查找是一个坏主意:您不希望进行 20 次查找来生成单个时间线页面。此外,它不会扩展:一旦您向服务器架构添加更多节点,不同的帖子可以存储在不同的节点上,这会使查询速度变慢。
似乎最好使用counter 数据类型来存储计数器。这需要创建一个单独的仅计数器表。 See here 了解更多信息。据我了解,使用这种类型可以提高(更新的)可扩展性。
如果将每个新的点赞/评论/分享写入时间线变得过于昂贵,则可以使用内存缓存:计数器存储在缓存中,并在生成时间线时查找。然后可以延迟时间线存储值更新,并作为不在缓存中的计数器的后备。我认为从 RAM 中查找 20 次单个请求是可以的。
如果您计算条目浏览量,#3 会很有用。由于您不计算观看次数,因此我认为更新每个点赞/评论/分享的时间线是可以的。
【讨论】:
您可以存储单个帖子,然后使用单个范围查询检索所有帖子 - 这将允许您使用计数器数据轻松更新单个帖子,但您仍然可以检索时间轴中的所有帖子使用一个查询。有关在气象站使用温度记录的示例,请参阅 this article。
CREATE TABLE posts (
post_id text,
post_time timestamp,
post text,
timeline_id set<text>,
comments_count counter,
PRIMARY KEY (post_id,post_time)
);
CREATE INDEX timeline_id_index ON posts (timeline_id);
SELECT post, comments_count
FROM posts
WHERE timeline_id CONTAINS ’foo’
AND post_time > ’2013-04-03 07:01:00′
AND post_time < ’2020-04-03 07:04:00′;
UPDATE posts
SET comments_count = comments_count + 1
WHERE post_id='bar';
【讨论】:
set<text>(或set<uuid> 或其他)作为timeline_id,然后在您的查询中使用CONTAINS 以检索具有给定的所有帖子时间线