2010-12-27 18 views
14

Wie groß ist die Länge der Primärschlüsselspalte? Ich werde Varchar als Primärschlüssel verwenden. Ich habe keine Information gefunden, wie lange es sein kann, da PostgreSQL bei Verwendung als Primärschlüssel keine varchar limit angeben muss?Länge des PostgreSQL-Primärschlüssels

+2

Ich sehe, kann ich eine Menge Daten in solche Primärschlüssel, aber es ist keine gute Idee. Danke für alle Antworten. – FolksLord

Antwort

6

Ich glaube, dass maximale Varchar-Länge eine Postgres-Konfigurationseinstellung ist. Es sieht jedoch so aus, als könnte es 1 GB nicht überschreiten.

http://wiki.postgresql.org/wiki/FAQ#What_is_the_maximum_size_for_a_row.2C_a_table.2C_and_a_database.3F

Das heißt worden, es ist wahrscheinlich keine gute Idee, eine große Varchar-Spalte als Primärschlüssel zu haben. Betrachten mit einem seriellen oder bigserial (http://www.postgresql.org/docs/current/interactive/datatype-numeric.html#DATATYPE-SERIAL)

+0

+1 für die Feststellung, dass Varchar eine schlechte PK ist. Dies führt zu schlechter Leistung bei der Verwendung innerhalb von Referenztabellen (ich habe Ihren Link auf die neueste PG-Version geändert). – DrColossos

+2

@DrColossos: Dies ist NUR wahr, wenn Sie das varchar-Feld als Fremdschlüssel in einer anderen Tabelle verwenden. Wenn dieses Feld einfach UNIQUE sein muss und NOT NULL * und * nur in dieser einen Tabelle referenziert wird, dann wird Ihnen das Hinzufügen eines numerischen "PRIMARY KEY" wirklich weh tun. Sie werden nun den Overhead sowohl des numerischen PK * als auch des zusätzlichen UNIQUE INDEX in der NOT NULL varchar-Spalte (erforderlich zur Sicherstellung der Datenintegrität) auf sich nehmen. Es ist ein guter Ratschlag, wenn man über Fremdschlüssel spricht, aber zu sagen, "Varchar ist eine schlechte PK" ist irreführend. –

+0

@Matthew Danke für das Follow-up: D war mir der Details nicht bewusst und wie ich meinen Kommentar interpretiere. Ich habe zwar "[...] bei Verwendung in Referenztabellen [...]" klar genug verstanden, dass ich Foreign Keys meinte, aber Sie haben eindeutig mehr Einblick in dieses Thema gegeben. Jetzt weiß ich es besser, danke! – DrColossos

19

Die maximale Länge für einen Wert in einem B-Baum-Index, der Primärschlüssel beinhaltet, ist ein Drittel der Größe einer Pufferseite, die standardmäßig Bodens (8192/3) = Bytes.

4

Sie sollten einen Test machen.

Ich habe Tests mit Tabelle, die einzelne Varchar-Spalte als Primärschlüssel haben, auf PostgreSQL 8.4 gemacht. Das Ergebnis ist, dass ich 235000 ASCII-Zeichen, 116000 polnische diactrische Zeichen (z. B. "c") oder 75000 chinesische Zeichen (z. B. "汉") speichern konnte. Für größere Sätze habe ich eine Nachricht:
BŁĄD: index Zeile Größe 5404 überschreitet btree maximal, 2712
Die Nachricht sagte jedoch:
Werte größer als 1/3 einer Pufferseite kann nicht indiziert werden.
Also die Werte waren erlaubt, aber nicht die ganze Zeichenfolge wurde für die Eindeutigkeitsprüfung verwendet.

Nun, dies ist eine sehr große Menge an Daten, die Sie in diese Spalte einfügen können. Wie oben erwähnt, ist Ihr Entwurf jedoch schlecht, wenn Sie so lange Werte wie Schlüssel verwenden müssen. Sie sollten einen künstlichen Primärschlüssel verwenden.