我有创建社交Feed(新闻Feed)的任务。我认为没有必要解释标准功能 - 所有都是如何作为FB。 我选择了解决方案 apache cassandra 并设计了一个数据列帖子来存储有关帖子用户的信息:
CREATE TABLE Posts (
post_id uuid,
post_at timestamp,
user_id text,
name varchar,
category set<text>,
link varchar,
image set<varchar>,
video set<varchar>,
content map<text, text>,
private boolean,
PRIMARY KEY ((post_id, user_id), post_at)
)
WITH CLUSTERING ORDER BY (post_at DESC) COMPACT STORAGE;
下一个表包含id用户帖子:
CREATE TABLE posts_user (
post_id bigint,
post_at timestamp,
user_id bigint,
PRIMARY KEY ((post_id), post_at, user_id)
)
WITH CLUSTERING ORDER BY (post_at DESC) AND COMPACT STORAGE;
你觉得怎么样,好吗?你在这样的数据模型中做了什么改变?
答案 0 :(得分:1)
有几个问题和一些改进可以跳出来。
现在不推荐使用COMPACT STORAGE(如果您想利用CQL 3功能)。我不认为您可以像上面定义的那样创建表Posts
,因为它使用带有COMPACT STORAGE的CQL 3功能(集合)以及声明不属于主键的多个列。 / p>
posts_user
的密钥类型与Posts
完全不同。我不清楚这两个表之间的关系是什么,但我认为post_id
应该在它们之间保持一致,而你在一个表中将它作为uuid
并且{{1}在另一个。与其他领域也存在差异。
假设bigint
是唯一的并且表示单个帖子的id,将它作为post_id
表中复合主键的第一部分是很奇怪的,因为如果你知道的话Posts
然后您就可以唯一地访问该记录。此外,由于它是分区键的一部分,因此它还可以阻止您对多个帖子进行更广泛的选择,并利用您的post_id
顺序。
解决此问题的常用方法是创建专用索引表,以便按照您希望的方式对数据进行排序。
E.g。
post_at
或更全面:
CREATE TABLE posts (
id uuid,
created timestamp,
user_id uuid,
name text,
...
PRIMARY KEY (id)
);
CREATE TABLE posts_by_user_index (
user_id uuid,
post_id uuid,
post_at timestamp,
PRIMARY KEY (user_id,post_at,post_id)
WITH CLUSTERING ORDER BY (post_at DESC)
);
但是,在您的情况下,如果您只希望以单向方式选择数据,那么您可以使用CREATE TABLE posts_by_user_sort_index (
user_id uuid,
post_id uuid,
sort_field text,
sort_value text,
PRIMARY KEY ((user_id,sort_field),sort_value,post_id)
);
表格进行排序:
posts
如果您希望稍后添加其他索引,它会变得更加复杂,因为您需要不仅仅通过其帖子ID,而且还要通过其用户和post_at字段来索引每个帖子。