Вы уже предложили таблицу сопоставления vendor, product и vendor_product. Вы хотите, чтобы поставщики совместно использовали один и тот же продукт, если они оба хотят его использовать, но вы не хотите дублировать продукты. Правильно?
Если это так, тогда определите уникальный индекс / ограничение для естественного ключа, который идентифицирует продукт (название продукта?).
Если поставщик добавляет продукт, а он не существует, вставьте его в таблицу продуктов и сопоставьте его с этим поставщиком через таблицу vendor_product.
Если продукт уже существует, но сопоставлен с другим поставщиком, не вставляйте ничего в таблицу продукта и добавьте еще одну строку сопоставления, отображающую нового поставщика в существующий продукт (чтобы теперь продукт сопоставлялся двум поставщикам) .
Наконец, когда поставщик удаляет продукт, вместо того, чтобы фактически удалить его, просто удалите ссылку vendor_product, отображающую эти два элемента. Наконец, если другие поставщики еще не ссылаются на продукт, вы можете удалить продукт. В качестве альтернативы можно периодически запускать сценарий, который удаляет все продукты, на которые больше не ссылаются поставщики.
Наконец, укажите в таблице продуктов флаг, который говорит о том, что вы просмотрели продукт, а затем используйте что-то подобное для запроса продуктов, доступных для просмотра данному поставщику (мы будем называть идентификатор поставщика 7):
select product.*
from product
left join vendor_map
on vendor_map.product_id = product.product_id
where vendor_map.vendor_id = 7
or product.reviewed = 1;
Наконец, если продукт принадлежит нескольким поставщикам, вы можете запретить редактирование или, возможно, «разделить» отдельный продукт на новый уникальный продукт, когда один из владельцев-владельцев пытается отредактировать его, и разрешить им редактировать свои собственная копия продукта. Однако им, вероятно, потребуется изменить название продукта, если только вы не придумали какой-то другой естественный ключ, на котором будет основано ваше уникальное ограничение.