2009-07-28 11 views
1

Verbesserungen gemachtum SQL-Abfragen in DDL

  1. nvarchar (5000) zu verbessern Syntax leicht lesbarer
  2. Striche geändert unterstreicht
  3. Magnus' improvements

Ich folge my plan for my first database project.

Ich würde gerne irgendwelche Schwächen in den Abfragen und in der relationalen Tabelle wissen.

SQL-Abfragen in DDL

CREATE TABLE answers 
(
    question_id INTEGER FOREIGN KEY REFERENCES questions(user_id) 
         PRIMARY KEY 
         CHECK (user_id>0), 
    answer TEXT NOT NULL  -- answer must have text 
); 

CREATE TABLE questions 
(
    user_id INTEGER FOREIGN KEY 
        REFERENCES user_info(user_id) 
        PRIMARY KEY 
        CHECK (user_id>0), 
    question_id INTEGER FOREIGN KEY REFERENCES tags(question_id) 
         NOT NULL 
         CHECK (user_id>0) 
         SERIAL, 
    body TEXT NOT NULL,     -- question must have body 
    title VARCHAR(60) NOT NULL,   -- no empty title 
    moderator_removal BOOLEAN NOT NULL, -- by default false 
    sent_time TIMESTAMP NOT NULL 
); 

CREATE TABLE tags 
(
    question_id INTEGER FOREIGN KEY REFERENCES questions(question_id) 
         CHECK (user_id>0), 
    tag VARCHAR(20) NOT NULL, 
    CONSTRAINT no_duplicate_tag UNIQUE (question_id,tag) 
) 


CREATE TABLE user_infos 
(
    user_id INTEGER FOREIGN KEY REFERENCES questions(user_id) 
        PRIMARY KEY 
        CHECK (user_id>0) 
        SERIAL 
        UNIQUE, 
    username VARCHAR(25), 
    email VARCHAR(320) NOT NULL  -- maximun possible 
         UNIQUE, 
    password_sha512 INTEGER NOT NULL, 
    is_moderator BOOLEAN NOT NULL, 
    is_Login BOOLEAN NOT NULL, 
    has_been_sent_a_moderator_message BOOLEAN NOT NULL 
); 



-- to have default values 

ALTER TABLE questions ALTER COLUMN moderator_removal SET DEFAULT FALSE 

ALTER TABLE user_info ALTER COLUMN is_moderator SET DEFAULT FALSE 
ALTER TABLE user_info ALTER COLUMN is_login SET DEFAULT FALSE 
ALTER TABLE user_info ALTER COLUMN has_been_sent_a_moderator_message SET DEFAULT FALSE 


-- to have default values 

ALTER TABLE questions ALTER COLUMN moderator_removal SET DEFAULT FALSE 

ALTER TABLE user_info ALTER COLUMN is_moderator SET DEFAULT FALSE 
ALTER TABLE user_info ALTER COLUMN is_login SET DEFAULT FALSE 
ALTER TABLE user_info ALTER COLUMN has_been_sent_a_moderator_message SET DEFAULT FALSE 

Relationale Tabelle

alt text http://files.getdropbox.com/u/175564/db/db777.png

Was würden Sie in den DDL-Abfragen verbessern?

+1

Sie haben keine Fragen gestellt ... nur DDL. – Reunanen

+0

@Pukku: Ich hatte die Idee, dass DDL eine Teilmenge von SQL ist. –

+1

(OT) Als ersten Schritt entfernen oder ersetzen Sie die Bindestriche (z. B. mit Unterstrichen) in den Identifikatoren. Oder zitieren Sie sie. –

Antwort

3

Wenn Sie varchar (4000) und so verwenden, ist 4000 tatsächlich ein konzeptionelles Maximum davon, wie lange die Zeichenfolge da sein kann? Oder hast du gerade etwas ausgewählt, das groß genug für alles ist? Wenn die zweite, verwenden Sie einfach den Text Datentyp. Es wird genauso schnell (tatsächlich, ein kleines bisschen schneller, aber Sie werden wahrscheinlich nicht in der Lage sein, das zu messen).

sent_time sieht aus wie es sein sollte timestamptz. Speichern Sie Datum/Uhrzeit nicht in einem Varchar.

auto_increment ist nicht in Postgres, verwenden Sie eine serielle Spalte.

Sie haben eine zirkuläre Referenz zwischen Tags und Fragen, die Sie sicher nicht beabsichtigt haben. Und Ihre Checkbeschränkung für Questions.question_id erscheint checks user_id - zu viel Kopieren/Einfügen wette ich.

Verwenden Sie schließlich keine Groß-/Kleinschreibung. Machen Sie alles klein, Sie müssen sie also nicht zitieren. Verwenden Sie beispielsweise Kleinbuchstaben für Spalten- und Tabellennamen.

+0

* Verwenden Sie schließlich keine Groß-/Kleinbuchstabenbezeichner. Tun Sie alles in Kleinbuchstaben, also müssen Sie sie nicht zitieren. * --- Meinst du, ich sollte die Befehle wie 'CREATE TABLE',' USER_ID' und 'NOT NULL' in Kleinbuchstaben umwandeln? –

+0

Der folgende Thread basiert auf Ihrem letzten Absatz: http://stackoverflow.com/questions/1199868/to-understand-a-sentence-about-the-case-in-sql-ddl-queries –

+0

@Magnus: In welcher Systeme benötigen Sie *, um [Spalten- und Tabellennamen] * anzugeben, wenn Sie Großbuchstaben verwenden? –