对象映射解决方案



我有这个SQL数据库结构。用户表、对象表格和映射表users_objects_map将对象分配给用户帐户。

在SQL中,它运行良好。使用这种结构,可以很容易地获取分配给对象的一个或多个用户的对象。我还可以将一个对象分配给多个用户。

      用户id名字姓。。。对象id。。。用户对象映射user_id对象id

使用MongoDB构建此数据库的最佳方法是什么?

我的第一个想法是向用户添加一个数组,其中将存储assign对象的所有ID。

{"名字":"John","姓氏":"Doe","object_ids":["id","id2",…,"id-n"]}

但是,如果一个用户被分配到数千个对象,那会是什么呢?我认为这不是一个好的解决方案。如何获取分配给对象的所有用户或分配给用户的所有对象?

有什么聪明的MongoDB解决方案可以解决我的问题吗?

使用BsonArrays中的对象id作为对对象的引用是一种很好的方法,还可以考虑在用户本身的"object_id"中使用BsonDocuments,然后您将能够更容易地扩展它,并使用"_id"(ObjectID)使MongoDB对这些id进行索引,这将获得性能。

最终,您将拥有两个集合,一个是用户集合,另一个是对象集合:

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的驱动程序。

示例:给我所有拥有object 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();

我希望我在这方面帮助过你。

祝你好运!

最新更新