为了提高在DDL SQL查询(To improve SQL-queries in DDL)

2019-06-27 01:22发布

做改进

  1. 为nvarchar(5000) - >为nvarchar(4000),但在的PostgreSQL => TEXT没有nvarchar的
  2. 内存限制一些变量
  3. 语法略微更改为更可读
  4. 破折号为下划线
  5. Magnus的改进

我下面我为我的第一个数据库的项目计划 。

我想知道的查询,并在关系表中的任何弱点。

SQL查询中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

关系表

替代文字http://files.getdropbox.com/u/175564/db/db777.png

你会在DDL查询改善什么?

Answer 1:

当您使用VARCHAR(4000)等,4000实际上的字符串可以有多长,有一个概念上的最大? 还是你只是挑事“的一切足够大”? 如果第二,只使用文本数据类型。 这将是一样快(实际上,一点点更快,但你很可能没有能够测量)。

SENT_TIME看起来像它应该是一个timestamptz。 不要储存的日期/时间在一个varchar。

AUTO_INCREMENT是不是在Postgres的,使用串行列。

你有标签和问题之间的循环引用,这一点我敢肯定,你不打算。 而就Questions.question_id你的检查约束,出现检查user_id说明 - 太多的复制/粘贴我打赌。

最后,不要使用大小写混合的标识符。 尽一切小写,所以你不必说出来了。 例如,使用列名和表名小写。



文章来源: To improve SQL-queries in DDL