我正在研究一些发布论坛项目,并试图找出理想的Firestore数据库结构。 我读到文档的最大大小为1 mg,但是通过在文档中存储多个帖子而不是为每个帖子使用单个文档来最大化每个文档的存储空间的利弊是什么?
我认为它会便宜一些。假设该应用程序将使用文档中的所有数据,则带宽成本将是相同的,但不是多次读取,我将只为一个文档付费。这有道理吗?
它还会更快吗?
答案 0 :(得分:3)
您可能会在一个文档中存储许多帖子,并且根据您的应用程序,这样做可能有充分的理由。请记住以下几点:
在任何NoSQL数据库中对数据建模时,我的指导原则是:
建模应用程序屏幕
我倾向于在应用程序中显示的屏幕之后对数据库中的数据进行建模。因此,如果您通常在用户启动应用程序时显示最近文章的标题列表,那么我实际上可能会创建一个仅包含最近文章的标题的文档。这样,该应用程序只需要阅读仅带有标题的单个文档,而不必阅读每个单独的帖子。这样不仅减少了应用程序需要阅读的文档数量,而且减少了它占用的带宽。
不要害怕重复数据
这与以前的指南并驾齐驱,并且在所有NoSQL数据库中都很正常,但是与我们许多人从关系数据库中学到的核心思想背道而驰。有时也称为反规范化,因为它可以反驳关系数据库模型的数据库规范化。
继续前面的示例:您可能会对每个帖子都有一个单独的文档,只是要确保每个帖子都有自己的单个定义点。但是,您会将部分帖子存储在其他许多地方,例如我们之前拥有的最新标题中。这意味着我们必须将每个新帖子的数据复制到该文档中,并可能复制到其他多个位置。此过程称为扇出,其中有一些common strategies for updating this denormalized data。
我发现,只要清楚每个实体的定义重点是什么,这种重复就不会引起任何问题。因此,在我们的示例中:如果后文档本身中的帖子标题与最近标题文档之间存在差异,我知道我应该更新最近标题文档,因为邮政文件本身就是我对邮政的定义。
所有这些的结果是,我经常将数据库视为实际数据存储的一部分,一部分是应用程序屏幕的预渲染片段。只要定义要点清楚,它就可以很好地工作,并且允许我定义数据模型,该模型可以有效地扩展使用数据的应用程序用户以及操作数据的成本。
要了解有关NoSQL数据建模的更多信息: