MongoDB中的多对多

时间:2011-08-03 22:45:44

标签: mongodb database-design database nosql

我决定尝试一下MongoDB,看看我们相处得如何。我确实有一些问题。

前提

  • 我有用户(身份证,姓名,地址,密码,电子邮件等)
  • 我有邮票(身份证,类型,价值,价格等)
  • 用户浏览邮票存档并以各种方式过滤(分页,按价格,类型,名称等过滤),选择一个邮票,然后将其添加到他们的收藏中。
  • 用户可以在他们的收藏中添加一个以上的印章(1片薄荷和1件使用或只使用2件)
  • 用户可以标记他们的一些邮票以进行销售或交易,而perhapa会指定价格。

到目前为止

这是我到目前为止所拥有的:

{
 _id : objectid,
 Name: "bob",
 Email: "bob@bob.com",
 ...
 Stamps: [stampid-1, stampid-543,...,stampid-23]
}

问题

  1. 我应该如何添加自有印章的状态,数量和条件?
  2. 对于前面描述的情况会有什么样的查询?
  3. 据我所知,ensureindex可以减少“扫描”条目的数量。
  4. The accepted answer here不断更改索引。这仅仅是为了解释它还是这样做的方式?我的意思是它确实有道理,但我一直在用sql术语来思考它......它没有任何意义......

2 个答案:

答案 0 :(得分:3)

我要做的唯一改变是如何存储用户拥有的邮票。我会存储一个表示邮票的对象数组,并复制更常访问的值。

例如类似的东西:

{
    _id : objectid,
    Name: "bob",
    Email: "bob@bob.com",
    ...
    Stamps : [
        {
            _id: id,
            type: 'type',
            price: 20,
            forSale: true/false,
            quantity: 2
        },
        {
            _id: id2,
            type: 'type2',
            price: 5,
            forSale: false,
            quantity: 10
        }
    ]
}

您可以看到某些数据在邮票集合和用户集合中的邮票数组之间重复。您可以使用更频繁访问的属性来执行此操作。因为否则你必须为每个标记执行一个findOne,最好直接读取在MongoDB中执行该操作的数据。这样,您可以在此处添加其他属性,例如数量和forSale。

  

此处复制的目的是避免对数组中的每个戳记运行查询。

有一个视频链接讨论MongoDB设计,并解释了我在这里尝试解释的内容。

http://lacantine.ubicast.eu/videos/3-mongodb-deployment-strategies/

答案 1 :(得分:0)

来自SQL背景,也在与NoSQL斗争。在我看来,很多事情都取决于不变的数据类型可能有多少,也可能没有。在RDBMS系统中让我感到困惑的一件事是为什么不可能说特定的列/字段是“不可变的”。如果你知道一个字段在NoSQL上下文中是不可变的(或差不多),那么我觉得复制信息更容易被接受。在很多情况下你可能真的想要结合使用SQL和NoSQL结构,这是完全的异端吗?