Документированные базы данных (в частности, RavenDB) действительно интригуют меня, и я хочу немного поиграть с ними. Однако, как человек, который очень привык к реляционному сопоставлению, я пытался подумать о том, как правильно моделировать данные в базе данных документов.
Скажем, у меня есть 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
показывает только задачи для конкретной задачи.
Для моделирования этого в базе данных документов я подумал о следующих трех идеях:
-
Задачи модели в виде отдельного документа. Это похоже на анти-документ db, так как большую часть времени, когда вы смотрите на компанию или обратитесь к вам, вы захотите увидеть список задач, поэтому вам придется много работать над документами.
-
Сохраняйте задачи, которые не связаны с контактом в списке
Company.Tasks
, и ставьте задачи, связанные с контактом в списке для каждого отдельного контакта. Это, к сожалению, означает, что если вы хотите увидеть все задачи для компании (что, вероятно, будет много), вы должны объединить все задачи для компании со всеми задачами для каждого отдельного контакта. Я также вижу, что это сложно, когда вы хотите отключить задачу от контакта, поскольку вам нужно переместить ее из контакта в компанию. -
Сохраняйте все задачи в списке
Company.Tasks
, и каждый контакт имеет список значений id для задач, с которыми он связан. Это похоже на хороший подход, за исключением того, что нужно вручную принимать значения id и создавать под-список объектовTask
для контакта.
Каков рекомендуемый способ моделирования этих данных в базе данных, ориентированной на документ?