Я думаю, что из трех вариантов, которые вы предоставили, я бы больше всего склонялся к варианту 1. Обычно у клиента или поставщика не будет больше, чем несколько разных адресов, но если они это сделают, возможно, решение ниже будет работать лучше для вас. Я бы не стал использовать вариант 2, потому что, вероятно, не имеет смысла связывать Адрес одновременно с Заказчиком и Продавцом. Я знаю, что вы, вероятно, устанавливаете только один из этих идентификаторов за раз, но модель может сбивать с толку, и вам может понадобиться добавить специальную логику, чтобы убедиться, что только CustomerID или VendorID установлен для любой данной записи. Я определенно не буду делать вариант 3, потому что вы не можете сделать FKID настоящим FK. Если вы хотите, чтобы столбец ссылался более чем на одну таблицу, вы не сможете использовать ограничение FK в базе данных для его применения. Кроме того, если вы планируете использовать ORM для взаимодействия с базой данных в коде, у них, как правило, возникают проблемы с «поддельными» внешними ключами, которые ссылаются на несколько таблиц в зависимости от отдельного столбца «дискриминатора».
Если вы хотите действительно открытое решение, вы можете создать отношения «многие ко многим» между Customer и Address и Vendor и Address.
Customer
--------
CustomerID (PK)
Vendor
------
VendorID (PK)
Address
-------
AddressID (PK)
CustomerAddress
---------------
CustomerID (FK/PK)
AddressID (FK/PK)
VendorAddress
-------------
VendorID (FK/PK)
AddressID (FK/PK)