Хороший вопрос, однако в корне кажется, что вы боретесь с созданием ограничения внешнего ключа для чего-то, что не является внешним ключом:
Orders.CustomerId -> Addresses.CustomerId
Нет простого встроенного способа сделать это, потому что обычно это не делается. В идеальных методах СУБД вы должны стремиться инкапсулировать данные определенных типов в свои собственные таблицы только . Другими словами, старайтесь избегать избыточных данных.
В приведенном выше примере владение адресом является избыточным как в таблице адресов, так и в таблице заказов, поэтому для их синхронизации требуются дополнительные проверки. Это может легко выйти из-под контроля с большими наборами данных.
Вы упомянули:
Однако я бы предпочел, чтобы Заказ был сведен таким образом, чтобы мне не приходилось направлять адрес для поиска клиента.
Но именно поэтому реляционная база данных является реляционной. Это делается для того, чтобы отдельные данные можно было хранить отдельно и ссылаться на относительные идентификаторы.
Я думаю, что лучшим решением было бы просто отменить это требование.
Другими словами, просто наберите:
Customers
+---------------+
| Id | Name |
+---------------+
| 1 | Sam |
| 2 | Jane |
+---------------+
Addresses
+----------------------------------------+
| Id | CustomerId | Address |
+----------------------------------------+
| 1 | 1 | 105 Easy St |
| 2 | 1 | 9 Gale Blvd |
| 3 | 2 | 717 Fourth Ave |
+------+--------------+------------------+
Orders
+--------------------+
| Id | AddressId |
+--------------------+
| 1 | 1 |
| 2 | 3 |
| 3 | 3 | <--- Valid Order/Address Pair
+--------------------+
С учетом вышесказанного, для точного достижения цели у вас есть просмотров доступных для такого рода вещей:
create view CustomerOrders
as
select o.Id OrderId,
a.CustomerId,
o.AddressId
from Orders
join Addresses a on a.Id = o.AddressId
Я знаю, что это довольно тривиальный вариант использования для представления, но я хотел вставить в него заглушку, потому что им часто пренебрегают и они пригодятся при организации больших наборов данных. Используя WITH SCHEMABINDING
, их также можно индексировать для повышения производительности.