Ваша базовая модель кажется неправильной. Ваша Voucher
сущность предположительно имеет много атрибутов - ВСЕ ли они изменяются после того, как она используется Customer
? Я сомневаюсь, что. И все же вы дублируете их в таблицах A и B, что означает, что ваша схема не нормализована.
«Доступный» ваучер и «использованный» ваучер не являются (или не должны быть) одним и тем же лицом. Вместо этого я бы предложил создать новую сущность для UsedVoucher
, которая будет ссылаться как на Voucher
как многие-к-одному, так и Customer
как на многие-к-одному и содержать только "измененные" свойства Voucher
( если есть) Таким образом,
Voucher(id, other attributes) // doesn't change from what you have now
Customer (id, other attributes) // doesn't change except for many-to-many; see below
UsedVoucher(id,
voucher, // what Voucher was used by that customer
customer, // what Customer has used that voucher
changed voucher attributes, // if any
additional attributes // if needed, such as date/time when voucher was used
)
Ваше «многие-ко-многим» на Customer
станет «один-ко-многим» (коллекции ваучеров, используемых этим клиентом), ЕСЛИ вам нужно это как обслуживаемое свойство; в противном случае его легко получить с помощью запроса.
Вы не можете физически удалить из таблицы Vouchers
в этом сценарии, хотя (если рассматриваемый Ваучер никогда не использовался). Вместо этого вам придется выполнить логическое удаление.