在构建数据模型时,需要考虑数据的一致性、读取速度以及更新速度等。在目前的数据模型中主要包括两种:嵌入式和引用式。
嵌入式
嵌入式模型也就是将子文档以字段的形式添加到文档中。以博客为例,一篇博客包括:标题、内容、标签、作者姓名和评论,评论又包括评论作者、内容以及时间。评论是一个完整的文档,并且以子文档的形式嵌入到博客中。格式如下:
{ "_id":"" , "title":"", "body":"", "author":"", "tags":[ "Tag1" "Tag2" "Tag3" ], "createDate":, "comments":[ { "body":"", "author":"", "createDate":""}]}
嵌入式模型可以在获取博客相关的内容时,一次获取,减少了与数据库的交互。单文档操作可以保证数据要么执行成功要么失败,对于数据的一致性来说也是一种很好的体验。
引用式
所谓的引用式就是只将子文档的id嵌入到文档中,并且子文档以文档的形式保存到集合中。格式如下:
{ "_id":"" , "title":"", "body":"", "author":"", "tags":[ "Tag1" "Tag2" "Tag3" ], "createDate":, "comments":[ "comment_id1", "comment_id2", "comment_id3"]}
在读取数据时,在读取博客内容后,通过博客中保存的评论id,再次从评论集合中获取所有对该博客的评论,在更新博客的评论时,只需修改博客评论即可。或者在搜索评论时,无需通过搜索博客来筛选。这样会大大提高操作效率。
模型使用决策
在选择数据库的模型来说主要考虑一下几点:
1、如果在访问数据时只通过一种方式,并且在频繁的访问,具有强烈的数据一致性。可以通过嵌入式在实现。
2、对数据的访问形式具有多种。例如博客中有许多评论可以通过博客来搜索评论,也可以通过评论的作者进行搜索。
3、一次修改可以实现多个文档的修改可以通过引用式实现。例如人员信息中包含住址,住址有包含多项内容。可以在人员信息中只包含地址文档的id。
4、文档与子文档具有一对多的关系时可以使用引用式实现。因为随着数据的不断增多,内存消耗更多。如果使用嵌入式,可能没法保证将整个文档一次获取,造成缺页现象,对读取数据造成影响。在更新性能上也会出现影响,由于一个子文档可能关联多个文档,引用式可以保证一次更新多个文档得到修改。提高了数据操作效率。
5、文档与子文档存在多对多关系时,使用引用式可以减少数据冗余。如果使用嵌入式,一篇博客具有多个标签,一个标签可能有多篇文档。随着数据的不断增加,博客中不断有大量的标签重复,这会导致出现大量的冗余标签数据。同时在更新标签信息时也会由于大量的博客文档使用了标签,需要对每个文档进行更新,降低了更新效率。使用引用式可以降低数据冗余,提高更新效率,因为只需更新标签文档信息即可。