Проектирование объектов ссылок - PullRequest
1 голос
/ 06 ноября 2011

При разработке документов я обычно использую ссылочные документы для определения отношений между различными типами документов.

Что-то вроде:

EmailDocument

  • Id
  • Тема
  • UserLink
    • DisplayName
    • UserId

Пользователь

  • Id
  • FirstName
  • LastName

Проблема в том, что если пользователь меняет свое имя, старое имя остаетсяво всех сопутствующих документах.Является ли ссылка документами плохим подходом или есть простой способ обновить все эти ссылки?(Обычно я создаю класс с именем User, а класс с именем UserLink. UserLink включается во все другие документы, имеющие отношение к пользователю.)

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Связанный пост здесь - Как синхронизировать изменения в nosql db (ravendb)

Я бы просто сохранил поле UserId внутри EmailDocument, которое предоставляет ссылку на конкретного пользователя. Raven предоставляет функцию включения для извлечения связанных документов в текущем сеансе / запросе, без (или, по крайней мере, очень мало - Raven оптимизируется для чтения в конце концов) дополнительных затрат и без дополнительного запроса GET.

http://docs.ravendb.net/consumer/querying/handling-document-relationships.html

var email = session.Include<EmailDocument>(x => x.UserId)
                   .Load(id);

 var user = session.Load<User>(email.UserId);

Это приведет к одному GET-запросу, который извлекает оба документа, и у вас также будет вся дополнительная информация, которую предоставляет пользовательский документ, вы можете построить свои модели представления из обоих объектов. Вы также избавите себя от необходимости отслеживать изменения имен и обновлять каждый документ, когда эти изменения происходят.

1 голос
/ 06 ноября 2011

Нет, я не думаю, что это плохой подход, так как он улучшит производительность во многих случаях.Но это добавляет сложности и требует от вас стратегии обновления имени при изменении родительского объекта (Пользователь).

Обычный дизайн вокруг этого состоит в том, чтобы выставлять события - когда возникает событие "UserChangedName", вы можете иметь прослушиватель, который обновляет все DisplayName во всех экземплярах EmailDocument.

...