1

行われた改善

  1. nvarchar(5000) -> nvarchar(4000) BUT PostgreSQL に nvarchar がない => TEXT
  2. 一部の変数に対するメモリ制限
  3. 構文が読みやすいようにわずかに変更されました
  4. ダッシュからアンダースコアへ
  5. マグナスの改良

私は最初のデータベース プロジェクトの計画に従っています

クエリとリレーショナル テーブルの弱点を知りたいです。

DDL の SQL クエリ

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

リレーショナル テーブル

代替テキスト http://files.getdropbox.com/u/175564/db/db777.png

DDL クエリの何を改善しますか?

4

1 に答える 1

3

varchar(4000) などを使用する場合、実際には 4000 は文字列が存在できる概念的な最大値ですか? それとも、「すべてに十分な大きさ」のものを選んだだけですか? 2 番目の場合は、テキストデータ型を使用します。それは同じように高速になります (実際には、わずかに高速ですが、それを測定することはできません)。

sent_time はtimestamptzである必要があるようです。日付/時刻を varchar に格納しないでください。

auto_increment は postgres にありません。シリアル列を使用してください。

タグと質問の間に循環参照がありますが、これは意図したものではないと確信しています。そして、Questions.question_id に対するチェック制約が表示され、user_id がチェックされます。コピー/貼り付けが多すぎるに違いありません。

最後に、大文字と小文字が混在する識別子を使用しないでください。すべて小文字にするので、引用符を付ける必要はありません。たとえば、列名とテーブル名には小文字を使用します。

于 2009-07-29T05:43:31.190 に答える