1

我仍在努力思考如何在野外使用像 Mongo 这样的东西。

有人可以向我解释一下吗(我知道这很简单)?

好的,假设我有一组用户,他们有一堆服务,在 SQL 数据库中,他们将像这样存储:

用户表

| user_id | name | address |
|---------|------|---------|
| 1       | Zen  | 1 a St  |
|---------|------|---------|

服务

| service_id | user_id | service_type | cost |
|------------|---------|--------------|------|
| 1          | 1       | hosting      | 50   |
|------------|---------|--------------|------|

在 Mongo 中,有人会将其存储在用户中吗?所以它更像是用对象来表示它?

例如

User: 1
    Name: Zen
    Address: 1 a St
    Services:
        service 1
             type: hosting
             cost: 50

如果是这样,是否有一个指向价值的“指针”(对于多个“事物”可能“拥有”另一个“事物”的情况,或者数据的层次结构具有需要这样做的关系?

有 SQL 背景的人如何考虑 Mongo 来解决这个问题?

谢谢

4

3 回答 3

1

建模可以或多或少是抽象的。在 SQL 的世界中,表几乎是您可以使用的最低级别的抽象,并且仍然将数据连接到底层主题。更高层次的抽象是关系建模和 ER 建模。“更高”不是“更好”的代名词。每个抽象级别都通过掩盖其他特征来突出某些特征。什么级别对您的目的有用取决于您想要更清楚地看到什么。

其他回复之一提到 Mongo 支持嵌套。嵌套可以是一种编码数据项之间的层次关系的方式,而不会强加很多上层结构。但是在不了解 Mongo 的情况下,我无法告诉您这是否是 Mongo 的架构师为他们的用户提供嵌套的原因。

等级关系可能是有益的,也可能是阻碍性的,这取决于你想要做什么。例如,如果您了解用户,并且您正在尝试查找所有服务,那么所提出的嵌套结构可能非常易于使用,并且可能非常有效。但是,如果您了解该服务,并且想找到所有用户,那么您将陷入困境。

克服层次结构的不幸副作用是关系模型和关系数据库获得认可的主要原因之一。但是等级关系并不总是“坏的”。在某些情况下,这是对数据建模的最佳方式。

回到您的问题,您可能希望在更高的抽象级别上将 SQL 与 Mongo 进行比较,而不是将表与嵌套结构进行比较。我已经告诉过您要寻找与 SQL 相关的更高级别的抽象。其他一些响应者将不得不为 Mongo 告诉你同样的事情。

最终,如果您继续提高抽象级别,您应该会找到一个同样适用于 SQL 和 Mongo 的模型。

于 2012-09-21T11:59:20.220 回答
0

MongoDB 中的有效数据建模遵循您的应用程序要求和常见用例。您可以将文档视为类似于序列化的对象;MongoDB 文档格式支持丰富的数据结构,包括嵌套。

首先考虑您的应用程序用例以规划您理想的查询和操作数据的方式是有建设性的。您不必在 MongoDB 中预先声明您的模式,这有助于原型设计。MongoDB 中的模式通常更类似于数据仓库,其中一些数据被故意非规范化以避免连接并提高性能。事实上,MongoDB 不支持连接或子查询 :)。

对于关系,如果您使用对象-文档模型或数据映射器,可能还有一些注意事项......其中许多提供者助手用于关系。

传统的选择是嵌入还是链接相关数据。

对于您的示例,您仍然可以拥有一个users集合和一个services集合:

  • 如果用户拥有多个服务,您可能会将他们的服务列表作为数组嵌入到用户文档中。

  • 用户的服务可能包括基本的详细信息,例如服务 ID 和名称;serviceID 将是一个唯一的 ID,可用于在服务集合中查找完整的服务定义。这将链接到服务集合。请注意,MongoDB 服务器不支持连接,因此如果您想查找用户和每个服务的完整详细信息,则需要多次查询。

相关阅读:

于 2012-09-21T06:16:03.997 回答
0

注意:我从未使用过 Mongo,但我已经开发了几个 NoSQL 解决方案。

在 Redis 和 CouchDB 中,我使用前缀-后缀样式命名约定存储对象。

服务 ===
services.userid.1
services.userid.2

用户 ===
users.userid.1
users.userid.2

现在应该轻而易举地找到用户的服务。=> services.user-name.wild-card

于 2012-09-21T01:42:41.023 回答