代码之家  ›  专栏  ›  技术社区  ›  Léo Léopold Hertz 준영

改进DDL中的SQL查询

  •  1
  • Léo Léopold Hertz 준영  · 技术社区  · 15 年前

    已完成的改进

    1. nvarchar(5000)->nvarchar(4000),但postgresql=>文本中没有nvarchar
    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查询中改进什么?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Léo Léopold Hertz 준영    15 年前

    当您使用varchar(4000)时,4000实际上是一个概念上的字符串可以存在多长时间的最大值吗?或者你只是选了一个“足够大的东西”吗?如果是第二个,只需使用 文本 数据类型。它的速度也一样快(实际上,稍微快一点,但你不太可能测量到)。

    发送时间看起来应该是 时间戳 . 不要将日期/时间存储在varchar中。

    自动增量不在Postgres中,请使用 系列 列。

    你在标签和问题之间有一个循环引用,我敢肯定你不是有意的。你对问题的检查限制。问题ID显示检查用户ID-我打赌复制/粘贴太多。

    最后,不要使用混合大小写标识符。做任何事情都要小写,这样你就不必引用它们了。例如,对列名和表名使用小写。