С точки зрения архитектуры данных, я предлагаю решить указанную вами проблему
... при размещении заказа он будет
всегда иметь возможность ссылаться на пользователя
адрес, который был использован во время
размещение заказа.
... вы просто копируете адрес человека в модель заказа. Элементы будут в модели OrderItem. Я бы переформулировал эту проблему следующим образом: «Заказ происходит в определенный момент времени. В OrderHeader включены все соответствующие данные на данный момент времени».
Это ненормально?
Нет, потому что OrderHeader представляет момент времени, а не текущую "правду".
Выше приведен стандартный способ обработки данных заголовка заказа, который значительно усложняет вашу схему, а не отслеживает все изменения в модели.
- Придерживайтесь решения, которое решает реальную проблему, а не возможные проблемы - кому-нибудь нужна история изменений пользователя? Или вам просто нужны заголовки заказа, чтобы отразить реальность самого заказа?
Добавлено: И обратите внимание, что вам нужно знать , какой адрес в конечном итоге использовался для отправки заказа / счета. Вы не хотите просматривать старый заказ и видеть текущий адрес пользователя, вы хотите видеть адрес, который использовался в заказе при отправке заказа. Смотрите мой комментарий ниже для получения дополнительной информации по этому вопросу.
Помните, что, в конечном счете, целью системы является моделирование реального мира. В реальном мире, после того, как заказ распечатан и отправлен с заказанным товаром, доставка заказа больше не меняется. Если вы отправляете мягкие товары или услуги, вам нужно экстраполировать из более простого примера.
Системы заказов - это отличный случай, когда очень важно понимать потребности и реалии бизнеса - не просто разговаривать с бизнес-менеджерами, но и разговаривать с руководителями отдела продаж, заказ клерки, клерки по дебиторской задолженности, сотрудники отделов доставки и т. д.