已完成改进
我关注my plan for my first database project。
我想知道查询和关系表中的任何弱点。
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
关系表
alt text http://files.getdropbox.com/u/175564/db/db777.png
您在DDL查询中有哪些改进?
答案 0 :(得分:3)
当你使用varchar(4000)等时,4000实际上是字符串可以存在多长时间的概念上的最大值?或者你刚刚选择了“足够大的东西”?如果是第二个,只需使用 text 数据类型。它会一样快(实际上,更快一点,但你不太可能测量它。)
sent_time看起来应该是 timestamptz 。不要在varchar中存储日期/时间。
auto_increment不在postgres中,请使用 serial 列。
你在标签和问题之间有一个循环引用,我相信你不打算这样做。而且你对Questions.question_id的检查约束会检查user_id - 我打赌过多复制/粘贴。
最后,不要使用大小写混合标识符。把一切都做成小写,所以你不必引用它们。例如,对列和表名使用小写。