ドキュメント指向のデータベース (特に RavenDB) には非常に興味をそそられており、少し試してみたいと思っています。しかし、リレーショナル マッピングに慣れている私は、ドキュメント データベースでデータを正しくモデル化する方法を考えていました。
C# アプリケーションに次のエンティティを含む CRM があるとします (不要なプロパティを除外します)。
public class Company
{
public int Id { get; set; }
public IList<Contact> Contacts { get; set; }
public IList<Task> Tasks { get; set; }
}
public class Contact
{
public int Id { get; set; }
public Company Company { get; set; }
public IList<Task> Tasks { get; set; }
}
public class Task
{
public int Id { get; set; }
public Company Company { get; set; }
public Contact Contact { get; set; }
}
Company
連絡先とタスクには会社以外の目的がなく、ほとんどの場合、タスクまたは連絡先のクエリには関連する会社に関する情報も表示されるため、 これをすべてドキュメントに入れることを考えていました。
問題はTask
エンティティに付属しています。ビジネスでは、タスクが常に会社に関連付けられている必要がありますが、必要に応じてタスクにも関連付けられているとします。
リレーショナル モデルでは、特定のタスクのタスクのみを表示し ながら、Tasks
テーブルがありCompany.Tasks
、会社のすべてのタスクに関連付けられているため、これは簡単です。Contact.Tasks
これをドキュメント データベースでモデル化するために、次の 3 つのアイデアを考えました。
タスクを別のドキュメントとしてモデル化します。ほとんどの場合、会社や連絡先を見ると、タスクのリストを見たいと思うので、これは一種のアンチドキュメントデータベースのように思えます。
連絡先に関連付けられていないタスクをリストに保持し、連絡先に関連付けられた
Company.Tasks
タスクを個々の連絡先のリストに入れます。これは残念なことに、会社のすべてのタスクを表示したい場合 (おそらく大量になるでしょう)、会社のすべてのタスクと個々の連絡先のすべてのタスクを結合する必要があることを意味します。また、連絡先からタスクを会社に移動する必要があるため、連絡先からタスクの関連付けを解除したい場合、これは複雑だと思いますすべてのタスクを
Company.Tasks
リストに保持します。各連絡先には、関連付けられているタスクの ID 値のリストがあります。Task
これは、id 値を手動で取得する必要があり、連絡先のエンティティのサブリストを作成する必要があることを除けば、良いアプローチのようです。
ドキュメント指向データベースでこのデータをモデル化するための推奨される方法は何ですか?