在系统设计中为快速搜索而创建的数据结构实际上是如何存储的?

How are the data structures which are created for making searches fast in a system design actually stored?

假设我正在设计一个像 Yelp 这样的餐厅推荐系统。我需要实现的一些基本内容如下:

  1. 用户应该能够 add/delete/update 个地方。
  2. 鉴于他们的位置 (longitude/latitude),用户应该能够找到给定半径内的所有附近地点。
  3. 用户应该可以添加 feedback/review 关于一个地方。反馈可以有图片、文字和评分。

从存储的角度来看,我决定为每个地点设置 LocationId、纬度、经度、名称、描述和评级等字段。假设每个 LocationId 和纬度和经度大约有 8 个字节,如果我为 5 亿个位置设计系统,我会提出大约 500 x 10^6 MB 的存储需求。到目前为止,还不错。

为了更快地得到位置查询结果,我决定使用四叉树,如图所示由网格组成,其中每个网格由500个位置组成。如果一个网格超过 500 个位置,它将被拆分成另一个网格,每个级别的最大网格为 4。假设我也创建了四叉树。我不确定在创建 Quatree 之后,wherehow 我们如何存储这棵树?

我能想到的一种可能的方法是我将序列化四叉树,并在一些类似的行上像我们序列化一个 n-ary 树并将它存储在一个文本文件中。考虑到我在树的节点中保留 LocationId、Longitude 和 Latitude 详细信息,如果每个字段为 8 个字节,我将需要为每个位置存储 24kb 的数据。对于 500 个这样的位置,我的树的总内存需求将是 ~24 * 500M = 12 GB。每当我的机器重新启动时,我都会反序列化存储的树并根据服务器的请求执行查询操作。

我发现这种方法的一个问题是我每次都需要定期更新我的文件,以便保留有关位置的最新信息。

任何人都可以建议还有哪些其他方式可以存储 QuadTree 以及我将在哪里存储它?我相信有更好的方法来存储我上面建议的四叉树。

四叉树适用于内存,但在存储数据时,DBMS 通常使用某种 R-Tree,例如 R*Tree 或 Sort-Tile-Recursive R-Trees (STR-Trees)。 R 树经过优化,使得一个节点适合一个磁盘页面。 STR-Trees 最适合一次批量加载整个数据,然后提供最佳性能。 R*Trees 更适合您希望 add/move/remove 单个点的场景。

从性能的角度来看,每个四叉树节点使用少于 500 个条目可能会更好,10 个或 50 个怎么样?

如果你想玩转不同的空间树,看看here or here(都在Java)。