我是MongoDb的新手,但我知道在文档数据库中谈论关系是闻到的。无论如何,我只是想了解它是否符合我的需求以及它的极限。
我的域名中只有一个简单的c#实体:
class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public ICollection<Person> Friends { get; set; }
}
我只是希望序列化过程使该集合成为一种
列表["...api/persons/1", "...api/persons/2", ...]
有可能吗?
答案 0 :(得分:6)
文档db中的关系是闻到的东西
不,一点也不。可悲的是,这个概念很受欢迎,但非关系数据库中的关系没有任何问题。这只是管理这些关系的另一种方法。
但是让我们来看看你的模特:
public ICollection<Person> Friends { get; set; }
正如您可能已经想到的那样,将序列化文档的树:
{ "name" : "doe",
"firstName" : "john",
"friends" : [
{ "name" : "rogers",
"firstName" : "mike",
"friends" : [ {"name" : "myers", "firstName" : "lucy", ... },
... ] },
... ] }
换句话说,这些不会序列化为关系,而是序列化为嵌入式文档。
现在最简单,最干净的方法是在你想要关系时存储关系:
class Person {
public ObjectId Id { get; set; }
public string FirstName { get; set; }
public List<ObjectId> FriendIds { get; set; }
}
这需要从您的域模型手动转换为与数据库兼容的模型,这就引出了您首先想要域模型的问题。
域模型的问题是它们需要RAM中的部分序列化图形。这似乎很方便从.NET端使用,例如你可以做点什么
person.Friends.First().Friends.Where(p => p.Name == "Doe").Friends.Last...
但是完全不清楚如何从数据库中获取所有这些内容,因为这个简单的单行表达式可能需要至少 4次往返数据库。虽然可以实现这样的映射(透明激活),但它隐藏了程序员的许多重要信息。
如果你在等式中添加修改(和修改跟踪),事情会很快变得非常混乱。
此外,该模型看起来像是对我的m:n关系(一个人可以有很多朋友,一个人可以被许多其他人称为朋友,对吧?)。对于m:n关系,嵌入引用列表可能不是最佳方法,但there are alternatives.