Нужен ли мне первичный ключ для моей таблицы, которая имеет UNIQUE (составные 4 столбца), один из которых может быть NULL?

У меня есть следующая таблица (PostgreSQL 8.3) в которой хранятся цены на некоторые товары. Цены синхронизируются с другой базой данных, в основном большинство полей ниже (кроме одного) не обновляются нашим клиентом, а вместо этого удаляются и обновляются время от времени для синхронизации с другой базой данных акций:

CREATE TABLE product_pricebands (
    template_sku varchar(20) NOT NULL,
    colourid integer REFERENCES colour (colourid) ON DELETE CASCADE,        
    currencyid integer NOT NULL REFERENCES currency (currencyid) ON DELETE CASCADE,
    siteid integer NOT NULL REFERENCES site (siteid) ON DELETE CASCADE,

    master_price numeric(10,2),

    my_custom_field boolean, 

    UNIQUE (template_sku, siteid, currencyid, colourid)
);

On синхронизации, я в основном УДАЛЯЮ большую часть данных выше, за исключением данных, ГДЕ my_custom_field имеет значение TRUE (если это TRUE, это означает, что клиент обновил это поле через свою CMS, и поэтому эту запись не следует удалять). Затем я ВСТАВЛЯЮ от 100 до 1000 строк в таблицу и ОБНОВЛЯЮ там, где ВСТАВКА не выполняется (т.е.где комбинация (template_sku, siteid, currencyid, colorid) уже существует).

У меня вопрос: какую передовую практику следует применить здесь для создания первичного ключа? Нужен ли первичный ключ? Я хотел сделать первичный ключ = (template_sku, siteid, currencyid, colorid) — но поле colorid может быть NULL, и использовать его в составном первичном ключе невозможно.

Судя по тому, что я читал на других форумах,Я думаю, что сделал вышеизложенное правильно, и мне просто нужно уточнить:

1) Должен ли я использовать «серийный» первичный ключ на тот случай, если он мне когда-нибудь понадобится? На данный момент я этого не делаю и не думаю, что когда-либо буду, потому что важными данными в таблице являются цена и мое пользовательское поле, идентифицируемое только комбинацией (template_sku, siteid, currencyid, colorid).

2) Поскольку (template_sku, siteid, currencyid, colorid) является комбинацией, которую я буду использовать для запроса цены продукта, должен ли я добавлять какие-либо дополнительные индексы в свои столбцы, такие как «template_sku», который является varchar? Или ограничение UNIQUE уже является хорошим индексом для моих SELECT?

9
задан Erwin Brandstetter 3 December 2012 в 04:07
поделиться