据我了解,在noSQL中,数据应该重复。因此,例如,如果您有一个users表和一个posts表,则可以像往常一样将用户信息存储在users表中,但是随后将相关的用户数据存储在posts表中。
问题1:我的理解正确吗?
问题2:如果是这样,这意味着如果我更改用户详细信息,我将更新所有受影响的帖子条目吗?
最佳答案
从Cassandra的角度来看,它主要取决于您需要有效支持的查询。查询帖子时,是否还需要用户数据?如果是这样,将所需的数据包括在存储帖子的位置通常会更有效。
因此,对于问题1,是的,在很多情况下,您所描述的是通用做法,但这取决于应用程序的需求。
对于问题2,这也是一个应用程序问题。如果您预见到用户数据会定期更改,那么您的应用程序可能应该在显示帖子时执行对users表的查找。但是,如果这引入了太多读取以至于无法及时显示所需的帖子,则将用户数据包括在帖子数据中意味着对用户数据的更改将需要在两个地方进行更改。但是,重要的是要询问历史数据是否需要更改。例如,如果您在Twitter上更改了用户名,它不会返回并将所有先前对您的引用更新为您的新用户名。这是一个应用程序选择。您预期会改变什么用户数据?如果要更改用户名,而您确实希望新值能够反映在所有以前的帖子中,那么该更改需要多长时间?应该立即反映出来,还是可以等待批处理来处理它?
要理解的重要事情是如何执行有效的查询,以及如何理解非规范化以实现高性能应用程序时进行的参照完整性折衷。设计数据模型时,请始终考虑应用程序查询模式。