Хорошо, давайте создадим таблицу, вставим некоторые примеры данных и посмотрим на результаты.
id cust_id shop_id shop_site_url
--
1 1000 2000 NULL
2 1000 2000 http://here-an-url.com
3 1000 2000 http://there-an-url.com
4 1000 2000 http://everywhere-an-url-url.com
5 1001 2000 NULL
6 1001 2000 http://here-an-url.com
7 1001 2000 http://there-an-url.com
8 1001 2000 http://everywhere-an-url-url.com
Хм. Это выглядит не очень хорошо. Давайте на минуту проигнорируем альтернативный URL. Чтобы создать таблицу, которая разрешает отношение m: n, вам нужно ограничение на столбцы, которые составляют отношение m: n.
create table customers_shops (
customer_id integer not null references customers (customer_id),
shop_id integer not null references shops (shop_id),
primary key (customer_id, shop_id)
);
(я опустил столбец «id», потому что он имеет тенденцию затенять происходящее. Вы можете добавить его позже, если хотите.)
Вставьте пример данных. , , то
select customer_id as cust_id, shop_id
from customers_shops;
cust_id shop_id
--
1000 2000
1001 2000
1000 2001
1001 2001
Это ближе. Вы должны иметь только одну строку для каждой комбинации клиента и магазина в этой таблице. (Это полезные данные даже без URL-адреса.) Что мы будем делать с альтернативными URL-адресами? Это зависит от нескольких вещей.
- Имеют ли клиенты доступ к сайтам через
только один URL, или они могут использовать больше
чем один?
Если ответ «только один», то вы можете добавить в эту таблицу столбец для URL и сделать этот столбец уникальным. Это ключ-кандидат для этой таблицы.
Если ответ «больше, чем один - по крайней мере, URL сайта и альтернативный URL», то вам нужно принять больше решений об ограничениях, потому что изменение этой таблицы позволяет использовать несколько URL для каждой комбинации клиента и Магазин режет по этому требованию:
поле shop_site_url уникально для
конкретный клиент и магазин
(поэтому не будет дублироваться для
разные клиенты / магазины)
По сути, я прошу вас решить, что означает эта таблица - определить предикат таблицы. Например, эти два разных предиката приводят к разным структурам таблиц.
- клиент 'n' посетил веб-сайт
для магазина "m", используя url 's'
- клиенту 'n' разрешено посещать
веб-сайт для магазина «м» с использованием альтернативных
url 's'