0

我是 MongoDB 的新手,我已经使用 RDBMS 多年了。

无论如何,假设我有以下收藏:

房地产经纪人
 许多:书签
 键:名称


房屋
 键:地址,字符串
 键:浴室,整数


特性
 键:地址,字符串
 键:土地类型,字符串


书签
 关键:笔记

我希望房地产经纪人能够为房屋和/或财产添加书签。请注意,房屋和财产是独立的,不知道房地产经纪人或书签。我希望书签有点像 MySQL 中的“连接表”。

房屋/物业来自不同的来源,因此无法修改。

我希望能够在 Rails 中做到这一点:

r = Realtor.first r.bookmarks 会给我:

House1 House2 PropertyABC PropertyOO1 等...

将有成千上万的房屋和财产。

我意识到这就是 RDBMS 的用途。但是我使用 MongoDB 有几个原因,所以我想让这项工作。

任何关于如何做这样的事情的建议将不胜感激。

谢谢!

4

1 回答 1

2

好的,第一件事。您已经将数据结构化,就好像这是一个 RDBMS。你甚至跑掉并创建了一个“连接表”,好像这样的东西在 Mongo 中很有用。

对您的问题的简短回答是,您可能会重新定义“第一个”以加载给定的“书签”。带有 $in 子句的“服务器端”或带有大 for 循环的“客户端”。

所以关于数据的两个大问题:

  1. 如果书签完全属于房地产经纪人,为什么它们在自己的收藏中?
  2. 如果房地产经纪人可以为房屋财产添加书签,那么为什么这些在不同的收藏中?这不是不必要的复杂化吗?如果您想在书签上使用 Realtor.first 之类的东西,为什么要将它们放在不同的集合中?

Realtors 集合可能应该由如下所示的项目组成:

{"name":"John", "bookmarks": [ 
   {"h":"House1","notes":[{"Nice location","High Ask"}] },
   {"p":"PropertyABC","notes":[{"Haunted"}] }
] }

请注意我如何区分房屋 ID 和财产 ID 的“h”和“p”?如果你接受我的下一个建议,你甚至不需要那个。

更进一步,您可能希望 Houses 和 Properties 在同一个集合中,例如“Locations”。在“Locations”集合中,您只需填充所有房屋和属性,并用“type”:“house”或“type”:“property”标记它们。然后,您将在“类型”字段上编制索引。

为什么?因为现在当您编写“第一个”方法时,您的查询非常简单。您所做的就是遍历“书签”并从“位置”集合中获取适当的键(“House1”、“PropertyABC”)。分页很简单,您查询 10 个项目然后返回。

我知道在某种程度上它看起来有点蹩脚。“为什么我要编写一个 for 循环来获取数据?我在 15 年前就试图停止这样做! ”但是 Mongo 是一个“面向文档”的存储,所以它针对加载单个文档。您正在尝试加载一堆文档,因此您必须跳过这个小圈。

幸运的是,这并不全是坏事。Mongo 在加载单个文档方面非常快。运行查询一次获取 10 个项目仍然非常快。

于 2010-05-24T06:26:44.590 回答