【发布时间】:2015-05-21 14:55:40
【问题描述】:
我们有很多属性的文章数据模型。这是我们的表格模型:
CREATE TABLE articles (
organization_id bigint,
gtin text,
barcodes text,
code text,
brand text,
season text,
name text,
option text,
style text,
color text,
sizes text,
supplier text,
category text,
prices text,
last_updated timeuuid,
content_hash uuid,
markdown boolean,
PRIMARY KEY (organization_id, gtin)
) WITH COMMENT='Articles';
gtin 唯一标识文章,我们将组织的所有文章保存在一行中。只有在某些情况发生变化时,我们才会更新每篇文章。这很重要,因为如果文章发生更改,我们会更新 last_updated 字段,并且外部设备知道要同步哪些文章,因为它们在上次同步时有信息。
为此我们又添加了一张表格:
CREATE TABLE articles_by_last_updated (
organization_id bigint,
gtin text,
barcodes text,
code text,
brand text,
season text,
name text,
option text,
style text,
color text,
sizes text,
supplier text,
category text,
prices text,
last_updated timeuuid,
content_hash uuid,
markdown boolean,
PRIMARY KEY (organization_id, last_updated)
) WITH CLUSTERING ORDER BY (last_updated ASC) AND COMMENT='Articles by last updated field';
因此我们可以轻松地返回在某个时间点之后更新的所有文章。必须从每个 gtin 的重复项中清除该表,因为我们每天导入文章并从移动设备完成同步,因此我们希望保持数据集较小(理论上我们可以将所有内容保存在该表中,并用最新信息覆盖,但这会创建大型数据集在同步之间,因此我们开始从该表中删除,并且要删除我们需要从第一个表中知道 last_updated)
我们现在面临的问题是:
- 为了检查文章字段是否更新,我们需要先读再写(我们部分解决了这个问题,
content_hash字段是所有字段的哈希值,因此我们读取传入文章的哈希值并将其与数据库中的值进行比较) - 我们正在第二个表中删除和插入,因为我们需要唯一的
gtins那里(只需要发送到设备的最新更改,而不是重复的文章),这会产生大量的墓碑 - 我们可以通过许多不同的字段组合来添加搜索功能
问题:
- cassandra 是这种数据的好选择,还是我们应该将其移动到其他存储(或者甚至将
elasticsearch和cassandra组合在一起,我们可以索引一段时间后的更改,而 cassandra 只能保存每个 @ 的主数据987654330@)? - 能否更好地为我们的用例建模数据,以避免在第二个表中先读取再写入或删除?
更新
只是为了澄清用例:其他设备正在与分页同步(发送last_sync_date和skip和count)所以我们需要包含所有文章信息的表格,按last_updated排序,没有重复,可以按last_updated搜索
【问题讨论】:
标签: cassandra data-modeling cassandra-2.1 nosql