Benötige ich einen Primärschlüssel für meine Tabelle, der eine EINZIGARTIGE (zusammengesetzte 4-Spalten) hat, von denen eine NULL sein kann?

Ich habe die folgende Tabelle (PostgreSQL 8.3), in der die Preise einiger Produkte gespeichert sind. Die Preise werden mit einer anderen Datenbank synchronisiert. Grundsätzlich werden die meisten Felder (außer einem) nicht von unserem Kunden aktualisiert. Stattdessen werden sie von Zeit zu Zeit gelöscht und aktualisiert, um mit einer anderen Bestandsdatenbank synchronisiert zu werden:

<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>

Bei der Synchronisation lösche ich im Grunde die meisten der oben genannten Daten mit Ausnahme der Daten, bei denen mein_Kundenfeld TRUE ist (wenn es TRUE ist, bedeutet dies, dass der Client dieses Feld über sein CMS aktualisiert hat und dieser Datensatz daher nicht gelöscht werden sollte). Ich füge dann 100 bis 1000 Zeilen in die Tabelle ein und aktualisiere, wo das Einfügen fehlschlägt (d. H. Wo die Kombination von (template_sku, siteid, currencyid, colourid) bereits existiert).

Meine Frage ist - welche bewährten Methoden sollten hier angewendet werden, um einen Primärschlüssel zu erstellen? Wird überhaupt ein Primärschlüssel benötigt? Ich wollte den Primärschlüssel erstellen = (template_sku, siteid, currencyid, colourid) - aber das Feld colourid kann NULL sein, und die Verwendung in einem zusammengesetzten Primärschlüssel ist nicht möglich.

Nach dem, was ich in anderen Forenbeiträgen gelesen habe, denke ich, dass ich das oben Genannte richtig gemacht habe und nur Folgendes klären muss:

1) Sollte ich einen "seriellen" Primärschlüssel verwenden, falls ich jemals einen benötige? Im Moment tue ich das nicht und denke nicht, dass ich es jemals tun werde, da die wichtigen Daten in der Tabelle der Preis und mein benutzerdefiniertes Feld sind, die nur durch die Kombination (template_sku, siteid, currencyid, colourid) identifiziert werden.

2) Da (template_sku, siteid, currencyid, colourid) die Kombination ist, mit der ich den Preis eines Produkts abfragen werde, sollte ich meinen Spalten weitere Indizierungen hinzufügen, z. B. die "template_sku", die ein Varchar ist? Oder ist die UNIQUE-Einschränkung bereits ein guter Index für meine SELECTs?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage