2009-07-01 11 views
4

Wir verwenden Sequenznummern für Primärschlüssel auf den Tabellen. Es gibt einige Tabellen, in denen wir den Primärschlüssel nicht für irgendwelche Abfragezwecke verwenden. Aber wir haben Indizes auf anderen Spalten. Dies sind nicht eindeutige Indizes. Die Abfragen verwenden diese Nicht-Primärschlüsselspalten in den WHERE-Bedingungen.Oracle - Gibt es einen Effekt, keinen Primärschlüssel auf einer Tabelle zu haben?

So sehe ich wirklich keinen Vorteil, einen Primärschlüssel auf solchen Tabellen zu haben. Meine Erfahrung mit SQL 2000 war, dass es verwendet wurde, um Tabellen zu replizieren, die einen Primärschlüssel hatten. Sonst würde es nicht.

Ich benutze Oracle 10gR2. Ich würde gerne wissen, ob es solche Nebenwirkungen von mit Tabellen gibt, die keinen Primärschlüssel haben.

Antwort

3

Von meinem Kopf aus können Sie keinen Fremdschlüssel ohne eindeutigen Schlüssel haben, daher gibt es keine Möglichkeit, die Tabelle mit anderen Tabellen zu verknüpfen. Dies nachträglich zu ändern, ist nicht trivial, da der gesamte Code, der auf diese Tabelle zugreift, beeinträchtigt sein kann, indem er entweder aufgrund verschobener Referenzen überhaupt nicht funktioniert oder anders arbeitet. Außerdem glaube ich, dass wir an uni gelernt haben (aber das war vor 5+ Jahren), dass eindeutige Indizes für die Leistung besser sind, weil Zeilen ohne Rücksicht auf ihren Inhalt segmentiert werden.

6

Es gibt einige Tabellen, wo wir nicht wirklich den Primärschlüssel für irgendeinen Abfragezweck verwenden.

Dann warum Sie eine Sequenz überhaupt haben, wenn Sie überhaupt nie benutzen? Jede Tabelle muss etwas haben, das einen Datensatz eindeutig identifiziert, es muss keine künstliche inkrementelle Sequenz sein (aka surrogate key), es könnte eine Kombination aus natural key sein). Es gibt immer Abfragen, die auf einen eindeutigen Schlüssel (Kandidatenschlüssel) zugreifen, was bedeutet, dass Sie definitiv einen Index benötigen, und Sie können den Index auch eindeutig machen.

Es gibt noch andere Vorteile PK Einschränkungen für alle persistenten (nicht nur vorübergehend) Tabellen zur Durchsetzung:

  1. Um sicherzustellen, dass Sie nie doppelte Werte haben (dass Ihre Anwendung nicht in der Lage sein wird, zu verderben die DB)
  2. Hilfe bei externen Werkzeugen automatische ER-Modellierung durchführen
  3. Last but not least - FK-Einschränkungen zulassen!
+1

+1 Zitat. "Wenn es keinen Primärschlüssel hat, ist es * KEINE * Tabelle!" :-) –

+1

Foreign Keys sind auf Uniques erlaubt, also keine Notwendigkeit von PK für das –

8

Eine Tabelle muss keinen Primärschlüssel haben. Es hat keinerlei Auswirkung auf die Datenbank, dass eine Tabelle keine expliziten Schlüssel hat, da jede Zeile in der Datenbank einen impliziten eindeutigen Datenpunkt hat, den Oracle für die Speicherung und bestimmte interne Referenzen verwendet. Das ist die ROWID-Pseudosäule. ROWID ist ein Datenelement, das jede Zeile in einer Datenbank eindeutig identifiziert - mit einigen bemerkenswerten Ausnahmen.

Die folgende Abfrage auf meiner Datenbank zurückgibt die Daten gezeigt:

 
select rowid from user$ where rownum <= 5; 

AAAAAKAABAAAAFlAAC 
AAAAAKAABAAAAFlAAD 
AAAAAKAABAAAAFiAAD 
AAAAAKAABAAAAFlAAE 
AAAAAKAABAAAAFlAAF 

Es ist nicht unbedingt notwendig, einen Schlüssel auf einem Tisch zu haben. Die Oracle10g-Datenbank, die ich gerade abgefragt habe, hat 569 Systemtabellen, die keine primären oder eindeutigen Schlüssel haben. Es ist eine Entscheidung für den DBA und den Entwickler, wie Schlüssel in Datenbanktabellen erstellt werden sollen. Die Entwickler in meinem Projekt erstellen immer Primärschlüssel unabhängig von ihrer Nützlichkeit oder Gesundheit. Als DBA erstelle ich Schlüssel nur dort, wo sie sinnvoll sind.

Mit freundlichen Grüßen

Opus

+0

Ich denke, dass das besonders gilt, wo Tabellen flüchtige Daten haben, wie in einem Data Warehouse ETL/ELT-Schema oder wo Sie sind einfach Rohdaten annehmen (zB von einem Netzwerkgerät) und das ist wirklich kein sinnvolles PK. Sie können eine Sequenz-generierte Zahl hinzufügen, aber genauso können Sie sich auch auf ROWID verlassen. –

Verwandte Themen