Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 卡桑德拉规范化_Database Design_Cassandra - Fatal编程技术网

Database design 卡桑德拉规范化

Database design 卡桑德拉规范化,database-design,cassandra,Database Design,Cassandra,我知道Cassandra中的规范化被认为是一种反模式,但如果它所暗示的存储需求太高,该怎么办 例如,我们目前有一个很大的“提要”表,分发给许多收件人,因此当前的模式类似于: CREATE TABLE feed_items_duplicated(recipient_id int, feed_id timeuuid, <data columns d1 to dn> PRIMARY KEY ((recipient_id), feed_id); 问题是一个提要可以分发给数百个

我知道Cassandra中的规范化被认为是一种反模式,但如果它所暗示的存储需求太高,该怎么办

例如,我们目前有一个很大的“提要”表,分发给许多收件人,因此当前的模式类似于:

CREATE TABLE feed_items_duplicated(recipient_id int, feed_id timeuuid, 
   <data columns d1 to dn> 
  PRIMARY KEY ((recipient_id), feed_id);
问题是一个提要可以分发给数百个接收者,并且每一行都可能非常庞大,其中的每一行都重复了d1到dn列

为了满足存储需求,我们考虑了另一种选择

CREATE TABLE feed_items(recipient_id int, feed_id timeuuid, 
  PRIMARY KEY ((recipient_id), feed_id);
CREATE TABLE feed_data(feed_id timeuuid, <data columns d1 to dn> 
  PRIMARY KEY (feed_id);
所以问题1:执行上面的查询是不是一个好主意,因为它很可能会命中集群中的所有节点?与并行执行每个f1到fn的专用查询相比,它有多糟糕

另一种方法是为feed_数据表创建一个小范围(比如[1-20])内的任意集群键,这样我们最多只能执行20个以下类型的查询:

SELECT * from feed_data where group_id = 1 and feed_id in (f1, f3, ...);
SELECT * from feed_data where group_id = 2 and feed_id in (f2, ...);

这种方法将每个查询限制为单个执行节点,但使用如此低的基数分区键,是否可以确保数据在节点之间均匀分布?

问题1:如果收件人可以接受可能的访问时间降低,那么值得一试。来自和nice的CQL查询中有许多关于“in”子句的建议和警告。我更愿意考虑的不是“in”查询

问题2:如果您的数据列[d1…dn]很小,并且彼此之间没有显著差异,那么我认为这不应该是一个问题。我认为数据项分组是一个好主意,如果它能给您带来数据重用能力的话。因此,您可以组织提要数据,如:feed1=bundle1+bundle2、feed2=bundle1+bundle3等,其中bundle1=data-item1+data-item2、bundle2=data-item3等

来自我自己:如果您不确定数据结构优化策略,那么可能值得尝试为您的提要数据引入某种逐出策略?像TTL或smth等。 因此,您可以让“实时”表保持原样,将过时的数据移动到更节省空间的存储中,甚至可以将其删除

SELECT * from feed_data where feed_id in (f1, f2, f3...);
SELECT * from feed_data where group_id = 1 and feed_id in (f1, f3, ...);
SELECT * from feed_data where group_id = 2 and feed_id in (f2, ...);