database - Cassandra 建模问题

标签 database cassandra data-modeling cassandra-3.0

首先,对于这么长的帖子深表歉意,请耐心等待。

我是 cassandra 新手,需要有人检查我的数据模型。我的目标是为社交媒体帖子表建立数据库模型。我计划使用以下两个表来有效地存储和获取帖子。

  1. 帖子表
  2. 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 。这有助于对结果进行排序,并且可能与您的情况相关。

对于您的第一个表,您确定需要 idcreatedat 吗?创建时间可以从 timeuuid 类型派生。或者,也许您需要更细粒度的时间?考虑一下这一点,因为您将需要两者来查询表。

正如您所猜测的,您的 posts_by_user 表才是真正的问题所在。从左到右思考你的 key 。因此,对于您的 posts_by_user,如果您想保留 createdat 通配符,则必须限制前面的所有列。我怀疑这就是你想做的事。例如,您不能仅限制mediatype

像这样的任意过滤在 Cassandra 中可能很难做到。考虑您的 UI/应用程序需要什么。这就是为什么首先对查询建模而不是表建模如此有用。

希望这对您有所帮助 - 祝您好运!

关于database - Cassandra 建模问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51261979/

相关文章:

database - 尽管它是 DDL,但如何回滚数据库上的 'truncate' 操作

cassandra - 操作系统补丁后无法启动 Cassandra

cassandra - Akka Persistence 和 Akka Persistence Query 有什么区别?

data-modeling - 概念数据建模 : Is RDF the right tool? 其他解决方案?

mysql - 在第 4 列中添加 3 列(具有 avg() 值)

.net - 可同步的CRM系统

ios - 书籍结构(目录)和内容的数据库设计

java - 如何关闭数据库连接 Datastax Java 驱动程序

Web应用程序的Azure表存储设计

mysql - 我的模型的数据建模、约束和问题