Я какое-то время откладывал разработку этой части своего приложения исключительно потому, что хочу сделать это по кругу, но чувствую, что это плохая идея из того, что я помню, как мои лекторы говорили мне еще в школе.
У меня есть дизайн для системы заказов, игнорируя все, что не относится к этому примеру, который у меня остался:
- Кредитная карта
- Покупатель
- Заказ
Я хочу так, чтобы,
- Клиенты могут иметь кредитные карты (0-n)
- У клиентов есть заказы (1-n)
- Заказы имеют один клиент (1-1)
- Заказы имеют одну кредитную карту (1-1)
- Кредитные карты могут иметь одного клиента (1-1) (уникальные идентификаторы, поэтому мы можем игнорировать уникальность номера копии, муж/жена могут делиться экземплярами копии и т. д.)
По сути, в последней части возникает проблема, иногда кредитные карты отклоняются, и они хотят использовать другую, для этого необходимо обновить их «текущую» карту, но это может изменить только текущую карту, используемую для этого заказа, а не другие заказы, которые клиент может иметь на диске.
По сути, это создает круговой дизайн между тремя столами.
Возможные решения: Либо
Создайте круговой дизайн, дайте ссылки:
- ссылка на заказ,
- ссылка клиента на копию
- ссылка клиента на заказ
or
- ссылка клиента на копию
- ссылка клиента на заказ
- создайте новую таблицу, которая ссылается на все три идентификатора таблицы, и укажите уникальный порядок в заказе, чтобы только одна копия могла быть актуальной для этого заказа в любое время.
По сути, оба моделируют один и тот же дизайн, но по-разному интерпретируются, мне больше нравится последний вариант на данный момент, потому что он кажется менее круглым и более центральным. (если это вообще имеет смысл)
Мои вопросы,
- Что, если таковые имеются, плюсы и минусы каждого?
- Каковы подводные камни циклических отношений/зависимостей?
- Является ли это действительным исключением из правил?
- Есть ли причина, по которой я должен выбрать первое вместо второго?
Спасибо и дайте мне знать, если есть что-то, что вам нужно уточнить / объяснить.
--Обновить/Изменить--
Я заметил ошибку в заявленных требованиях. В основном упал мяч, пытаясь упростить вещи для SO. Там есть еще одна таблица для платежей, которая добавляет еще один слой. Загвоздка в том, что заказы могут иметь несколько платежей, с возможностью использования разных кредитных карт. (если вы действительно хотите знать даже другие формы оплаты).
Утверждаю это здесь, потому что я думаю, что основная проблема все та же, и это только добавляет еще один уровень сложности.