首先,对于这么长的帖子深表歉意,请耐心等待。
我是 cassandra 新手,需要有人检查我的数据模型。我的目标是为社交媒体帖子表建立数据库模型。我计划使用以下两个表来有效地存储和获取帖子。
- 帖子表
- posts_by_user 表
所有帖子都将存储在第一个表中,即帖子,结构如下
CREATE TABLE myapp_keyspace.posts (
id timeuuid,
createdat bigint,
city text,
topFourComments list<frozen<comment>>,
commentscount bigint,
content text,
contenttype text,
country text,
county text,
createdon bigint,
deletedon bigint,
iscreator boolean,
isdeleted boolean,
likescount bigint,
latitude double,
longitude double,
medias list<frozen<media>>,
mediatype text,
postcreatedby timeuuid,
posttype text,
postusername text,
postuserprofilepic text,
sharecount bigint,
state text,
status int,
tags list<frozen<tag>>,
timezone text,
title text,
updatedon bigint,
PRIMARY KEY (id, createdat))
下面是一个不同的表,其中数据在时间轴屏幕上被复制。时间轴屏幕还具有以下过滤器(全部、图像、视频、文本、好友、组),以下是结构。
CREATE TABLE myapp_keyspace .posts_by_user (
postcreatedby timeuuid,
contenttype text,
mediatype text,
posttype text,
createdat bigint,
comments list<frozen<comment>>,
commentscount bigint,
content text,
createdon bigint,
deletedon bigint,
id timeuuid,
iscreator boolean,
isdeleted boolean,
likescount bigint,
medias list<frozen<media>>,
sharecount bigint,
status int,
tags list<frozen<tag>>,
title text,
updatedon bigint,
PRIMARY KEY (postcreatedby, contenttype, mediatype, posttype, createdat)
以下是我的两个问题
1.正如cassandra所说,为每个查询规划一个单独的表。考虑到时间线屏幕上的所有过滤器,为所有过滤器编写单个查询是否很好,或者我应该计划为每个过滤器单独编写。 (全部、图片、视频、文字、好友、群组)
2. 我应该如何计划存储 friend 的帖子。我正在考虑复制 post_by_user 表中所有 friend 的帖子。例如:如果我有 10 个 friend 并且我正在发帖。因此,单个帖子将被存储 10 次,posts_by_user 表中为每个 friend 存储一次。
由于这是我在 cassandra 中的第一个项目,因此我想在设计数据库时格外谨慎,以避免将来出现任何问题。
非常欢迎任何建议。
最佳答案
Cassandra 中的数据建模非常困难。完全不要因为与它作斗争而感到难过,尤其是一开始。对我来说效果很好并且与其他数据库(尤其是 SQL)完全不同的一件事是首先写出查询,而不是表。对于 Cassandra,select
语句就是问题所在。
我建议您实际写出您需要的每个select
,并记住执行查询时需要哪些信息。这很重要,因为它将决定您如何形成主键。另一个重要的功能是 compound keys 。这有助于对结果进行排序,并且可能与您的情况相关。
对于您的第一个表,您确定需要 id
和 createdat
吗?创建时间可以从 timeuuid
类型派生。或者,也许您需要更细粒度的时间?考虑一下这一点,因为您将需要两者来查询表。
正如您所猜测的,您的 posts_by_user
表才是真正的问题所在。从左到右思考你的 key 。因此,对于您的 posts_by_user
,如果您想保留 createdat
通配符,则必须限制前面的所有列。我怀疑这就是你想做的事。例如,您不能仅限制mediatype
。
像这样的任意过滤在 Cassandra 中可能很难做到。考虑您的 UI/应用程序需要什么。这就是为什么首先对查询建模而不是表建模如此有用。
希望这对您有所帮助 - 祝您好运!
关于database - Cassandra 建模问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51261979/