我有这个模式将post
及其注释存储在同一个表中:
CREATE TABLE post (
post_id int,
access_key text,
comment_id int,
title text,
comments FROZEN <type_comment>,
PRIMARY KEY ((post_id, access_key), comment_id)
);
CREATE TYPE ks_test.type_comment (
id int,
content text
);
这是一个示例数据
post_id | access_key | comment_id | comments | title
---------+------------+------------+--------------------------+--------------
1 | about_post | 1 | null | this is post
1 | comments | 2 | {id: 2, content: 'cmn1'} | null
1 | comments | 3 | {id: 3, content: 'cmn2'} | null
1 | comments | 4 | {id: 4, content: 'cmn3'} | null
我正在使用此架构,因此我只能访问一个表来获取post
及其注释。专业人士会怎样?这个架构的缺点?
答案 0 :(得分:2)
如果你能弄清楚如何填写id字段,那真的很好并且会有效。
我认为comment_id
中的id
和type_comment
是多余的。可以使用comments
替换整个content
列。
我个人会用时间uuid替换post_id,因为Cassandra中没有自动递增的东西id。在分布式环境中自动递增全局唯一标识符很困难。有一些东西要为你做,但实际上,只使用时间uuid / random uuid是最简单的。
CREATE TABLE post (
post_id uuid,
access_key text,
comment_id timeuuid,
title text,
content text,
PRIMARY KEY ((post_id, access_key), comment_id)
);
如果想按日期抓住它可以做类似的事情
CREATE TABLE post (
year int,
month int,
access_key text,
comment_id timeuuid,
title text,
content text,
PRIMARY KEY ((access_key, year, month), comment_id)
);
然后您可以按月抓取,也可以在该月的某个时段内使用范围。也可以做一个&#34; time_bucket&#34;将年/月替换为等时间字符串,如&#34; 2016-01-01 00:00:00&#34;你可以更容易地改变分组(即月,日等)。