2012-02-26 64 views
1

我有这个SQL数据库结构。 A 用户表,一个对象表和映射表 users_objects_map将对象分配给用户帐户。对象映射解决方案

在SQL中,它工作正常。通过这种结构,很容易获取用户或分配给对象的用户的对象。我也可以为多个用户分配一个对象。

 
users 
id 
firstname 
lastname 
... 

objects 
id 
... 

users_objects_map 
user_id 
object_id 

什么是最好的方式来构建这与MongoDB?

我的第一个想法是将数组添加到将存储所有分配对象的ID的用户。

{"firstname":"John", "lastname": "Doe", "object_ids":["id","id2",...,"id-n"]}

但是,如果用户被分配给数千个对象,那么该怎么办?我不认为这是一个好的解决方案。以及我如何能够获取分配给对象的所有用户或分配给用户的所有对象?

是否有我的问题的任何聪明的MongoDB解决方案?

+0

你可能做的也许是在用户中存储对象的集合 - MongoDB不允许集合之间的连接。但你必须小心地缩放这个 - 虽然我不知道你是什么样的卷处理。此外,如果您可以为“对象”提供结构,那么这将有助于搜索。对不起,但我不熟悉实用方面,所以不能提供任何示例代码。 – dubs 2012-02-26 14:45:00

回答

0

在BsonArrays中使用对象ID作为对象的引用是一个很好的方法,也可以考虑在用户本身的“object_ids”中使用BsonDocuments,然后您将能够更轻松地缩放它,并使用“_id “(ObjectID),以便MongoDB索引这些ID,这将获得性能。

最终,你将有2点集合,一个是用户,另一种是使用对象:

user: 
{ 
    "_id" : "user_id", 
    "firstname" : "John", 
    "lastname" : "Doe", 
    "object_ids" : [ 
     { "_id" : "26548" , "futurefield" : "futurevalue" }, 
     { "_id" : "26564" , "futurefield" : "futurevalue" } 
    ] 
} 

这一刻我真不知道他们要什么样的对象是..但我可以给你一个例子:

workshop object: 
{ 
    "_id>" : "user_id", 
    "name" : "C# for Advanced Users", 
    "level" : "300", 
    "location" : "Amsterdam, The Netherlands", 
    "date" : "2013-05-08T15:00:00" 
} 

现在来了有趣的部分,这是查询。 我正在使用C#开发并使用mongodb.org的驱动程序。

例如: 给我所有对象id ==“26564”的人。

var query = from user in userCollection.Find(Query.EQ("objects_ids._id","26564")) 
      select user; 

该查询将返回文档,在这种情况下是与ID匹配的用户。 如果您有一系列值,请使用:Query.All(“name”,“BsonArray Values”);

第二个查询是查找和/或匹配BsonDocuments可能包含的对象ID的ID。

var secondQuery = 
    from workshops in objectsCollection.Find(Query.EQ("_id", "userid")) 
    select cust["object_ids"].AsBsonArray.ToArray(); 

我希望我能以这种方式帮助你。

祝你好运!