Czy potrzebuję klucza podstawowego dla mojej tabeli, która ma UNIQUE (kompozytowe 4 kolumny), z których jedna może mieć wartość NULL?

Mam następującą tabelę (PostgreSQL 8.3), która przechowuje ceny niektórych produktów. Ceny są zsynchronizowane z inną bazą danych, w zasadzie większość poniższych pól (z wyjątkiem jednego) nie jest aktualizowana przez naszego klienta - ale zamiast tego jest usuwana i odświeżana raz na jakiś czas, aby zsynchronizować z inną bazą danych giełdowych:

<code>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)
);
</code>

Podczas synchronizacji zasadniczo usuwam większość powyższych danych, z wyjątkiem danych WHERE my_custom_field ma wartość TRUE (jeśli jest to PRAWDA, oznacza to, że klient zaktualizował to pole za pośrednictwem swojego systemu CMS i dlatego ten rekord nie powinien zostać usunięty). Następnie wstawiam do tabeli 100s do 1000s wierszy, a UPDATE tam, gdzie zawiedzie INSERT (tj. Gdzie kombinacja (template_sku, siteid, currencyid, colourid) już istnieje).

Moje pytanie brzmi - jakie najlepsze praktyki należy zastosować tutaj, aby utworzyć klucz podstawowy? Czy klucz podstawowy jest nawet potrzebny? Chciałem zrobić klucz podstawowy = (template_sku, siteid, currencyid, colourid) - ale pole colourid może mieć wartość NULL, a użycie go w złożonym kluczu podstawowym nie jest możliwe.

Z tego, co przeczytałem na innych postach na forum, myślę, że zrobiłem powyższe poprawnie i muszę tylko wyjaśnić:

1) Czy powinienem używać „seryjnego” klucza podstawowego na wypadek, gdyby go kiedykolwiek potrzebowałem? W tej chwili nie, i nie sądzę, że kiedykolwiek to zrobię, ponieważ ważne dane w tabeli są ceną i moim niestandardowym polem, identyfikowanym tylko przez kombinację (template_sku, siteid, currencyid, colourid).

2) Ponieważ (template_sku, siteid, currencyid, colourid) jest kombinacją, której użyję do zapytania o cenę produktu, czy powinienem dodać dalsze indeksowanie do moich kolumn, takie jak „template_sku”, który jest varchar? Czy też ograniczenie UNIQUE jest dobrym indeksem dla moich SELECT?

questionAnswers(1)

yourAnswerToTheQuestion