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