2017-02-01 2 views
1

Ich versuche Postgres nach der Arbeit mit mongodb für eine Weile zu lernen, und ich frage mich, wie man eine eindeutige ID für jede comment haben.Verwendet SERIAL in Ordnung für den Primärschlüssel beim Erstellen einer Tabelle aller Kommentare von Benutzern gemacht?

Ich habe einen Fremdschlüssel userId für den Benutzer den Kommentar erstellt, aber für Primärschlüssel brauche ich eine Art von commentId. Ist es in Ordnung, SERIAL für meine commentId zu verwenden? Oder gibt es einen besseren Ansatz wie UUIDs? Ich weiß nicht, ob ich jemals die Daten migrieren muss.

+2

sowohl "UUID" und "SERIAL" sind in Postgres verwendbar. SERIAL erstellt eine Sequenz und weist eine Spalte beim Erstellen einer Tabelle zu –

+0

danke für die Erklärung! – user1354934

Antwort

2

Da der tatsächliche Wert der Kommentar-ID Sie nicht interessiert (nur die Tatsache, dass es da ist und es ist einzigartig), serial ist eine gute Wahl für eine solche Spalte. Beachten Sie, dass das Erstellen einer serial in modernen PostgreSQL-Datenbanken (seit 7.3) nicht automatisch bedeutet, dass es eine eindeutige Einschränkung hat, so dass Sie dies explizit behandeln müssten. Z.B .:

CREATE TABLE comments (
    comment_id SERIAL PRIMARY KEY, 
    user_id INT REFERENCES users(id), -- You should probably also index it 
    comment VARCHAR(200) -- Or any other reasonable size 
) 

EDIT:
Um die Frage in den Kommentaren beantworten könnte ein ähnliches Verhalten für eine UUID Spalte erstellt werden, indem sie einen Standardwert eines neu generierten UUID geben.

Zuerst müssen Sie das Paket postgres-contrib installieren (falls Sie es noch nicht installiert haben). ZB auf Red Hat basiert Linuxen, könnten Sie (als root) laufen:

$ dnf install postgresql-contrib 

Dann von einem privilegierten Benutzer, müssen Sie die Erweiterung erstellen:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; 

Dies wird eine generate_uuid_v1 Funktion erstellen Sie könnten verwenden:

CREATE TABLE comments (
    comment_id UUID DEFAULT UUID_GENERATE_V1() PRIMARY KEY, 
    user_id INT REFERENCES users(id), -- You should probably also index it 
    comment VARCHAR(200) -- Or any other reasonable size 
) 
+0

Danke! Gibt es einen eingebauten Weg, um einen UUID ähnlich zu machen? – user1354934

+1

@ user1354934 es ist ein bisschen klirrender, aber sicher, es ist definitiv machbar. Siehe meine bearbeitete Antwort für Details. – Mureinik

+0

wow vielen dank Mureinik! Mir ist klar, dass Uuid wahrscheinlich langsamer ist, aber ich denke, es würde helfen, wenn man in Zukunft migriert, wenn es nötig ist, oder? Danke – user1354934

Verwandte Themen