我有一个使用User,Message和MessageFeatures等实体的应用程序。每个用户可以有许多消息,每个消息都有一个MessageFeatures实体。目前,关系模型表示为:
User{
UUID id
String email
...
}
Message{
UUID id,
UUID userId
String text
....
}
MessageFeatures{
UUID id
UUID messageId
UUID userId
PrimitiveObject feature1
....
PrimitiveObject featureN
}
最重要的查询是:
不太重要(可能很慢)的查询如下:
在评估沙发基地时,我无法找到合适的数据模型。我不认为在单个文档中为用户提供所有消息和消息功能是一个好主意,因为大小将继续增加,并且基于当前数据,对于2年数据,它将容易在4-5 MB的范围内。另外,为了保持一致性,我每次只能更新一个消息特征,因为原子性是每个文档。
如果我不将它们放在单个文档中,它们将分散在群集中,并且获取用户的所有消息/消息特征等查询将导致分散和聚集。
我检查了全局二级索引和N1QL,但即使我索引user_uuid消息字段,它只会帮助获取该用户的message_uuids,加载所有消息将导致分散和收集...
是否有办法强制将user_uuid的所有消息,消息功能映射到同一物理节点,而不将它们嵌入到同一文档中,就像redis中的hashtags一样。
答案 0 :(得分:1)
您应该将上面的关系模型直接翻译成Couchbase。您应该为所有关系(id字段)创建GSI索引。使用EXPLAIN确保每个查询都使用索引。要通过id直接查找,请使用USE KEYS。
在Couchbase中分散/聚集意味着与您描述的不同。当单个索引扫描必须访问多个节点然后合并扫描结果(分布式索引)时。相反,每个GSI索引都存在于一个节点上,因此GSI索引可以避免分散/聚集。
最后请注意,即使跨节点,Couchbase也能快速获取键值,因此您无需担心数据的位置。