完成的改进
- nvarchar(5000) -> nvarchar(4000) 但 PostgreSQL 中没有 nvarchar => TEXT
- 一些变量的内存限制
- 语法略微改变以提高可读性
- 破折号到下划线
- Magnus' improvements
我正在关注 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 查询中改进什么?
最佳答案
当您使用 varchar(4000) 等时,4000 实际上是字符串可以存在多长时间的概念最大值?还是您只是选择了“足够大以容纳所有东西”的东西?如果是第二种,只需使用 text 数据类型。它会一样快(实际上,快一点点,但您可能无法测量)。
sent_time 看起来应该是 timestamptz。不要将日期/时间存储在 varchar 中。
auto_increment 不在 postgres 中,使用 serial 列。
你在标签和问题之间有一个循环引用,我相信你不是故意的。并且您对 Questions.question_id 的检查约束出现检查 user_id - 我打赌复制/粘贴太多。
最后,不要使用大小写混合的标识符。一切都小写,所以你不必引用它们。例如,对列名和表名使用小写。
关于sql - 改进 DDL 中的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1195816/