私は現在、Nosqlデータベースがリレーションを処理する方法と、ドキュメントの一意のIDが実際に何を意味するのかを理解しようとしています。
たぶん、MongoDbに期待しすぎているか、NoSQLデータベースのリレーションの概念をまだ理解していません。
基本的に、次のテストは失敗します。ユーザーとグループの間のこのような関係(1:0..Nの関係)をどのようにモデル化するのでしょうか。
[TestFixture]
public class MongoDbExamples
{
private MongoServer _mongoServer;
[TestFixtureSetUp]
public void FixtureSetUp()
{
_mongoServer = MongoServer.Create();
}
[TestFixtureTearDown]
public void FixtureTearDown()
{
_mongoServer.Disconnect();
}
[Test]
public void RelationTest()
{
var database = _mongoServer.GetDatabase("StackoverflowExamples");
var p = new Person() { Name = "Testperson" };
var persons = database.GetCollection<Person>("Persons");
persons.Save<Person>(p);
var group = new Group() { Description = "A fancy descriptor" };
group.Add(p);
var groups = database.GetCollection<Group>("Groups");
groups.Save<Group>(group);
var readPerson = persons.FindOneById(p.Id);
readPerson.Name = "a different name";
// since the id hasn't change this is an update of the original person:
persons.Insert<Person>(readPerson);
// and I thought that it should be reflected in the group as well:
var readGroup = groups.FindOneById(group.Id);
Assert.AreEqual(readPerson.Id, readGroup.persons[0].Id); // this passes, the id is the same
Assert.AreEqual(readPerson.Name, readGroup.persons[0].Name); // this fails, the groups person still has the old name
}
}
そのような関係のベストプラクティスはありますか?たとえば、すべてのコレクション/ドキュメントですべての人物を検索し、見つかった人物を人物コレクションの一致する人物と交換する必要がありますか?または、リレーションはNoSQLデータベースが得意ではないものであり、リレーションを避ける必要があります(より複雑なオブジェクトグラフを使用するより大きなシステムでNoSQL-DBを使用する方法を知りたいです)。