sql - 改进 DDL 中的 SQL 查询

标签 sql database postgresql ddl

完成的改进

  1. nvarchar(5000) -> nvarchar(4000) 但 PostgreSQL 中没有 nvarchar => TEXT
  2. 一些变量的内存限制
  3. 语法略微改变以提高可读性
  4. 破折号到下划线
  5. 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/

相关文章:

c# - 使用 Microsoft.SqlServer.TransactSql.ScriptDom 生成查询

mysql - 使用 MYSQL/SQL 在两个日期之间搜索?

php - 将旧表中的数据插入到新表中

sql - Django 是否对基本查询(使用 Postgres)进行索引优化?

sql - 找到一公里内最大的点簇

java - ORA-00936,Java 和 SQL

sql-server - 不使用单引号更新字符串列 - 一般问题

java - Android在Service类中使用数据库

sql - 子查询和排序? (排序依据)

xml - 如何在 postgres 版本 9.2 中转义 ">"字符