【问题标题】:To improve SQL-queries in DDL改进 DDL 中的 SQL 查询
【发布时间】:2010-11-14 19:31:09
【问题描述】:

已完成改进

  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 查询中改进哪些方面?

【问题讨论】:

  • 您没有发布任何查询...只有 DDL。
  • @Pukku:我认为 DDL 是 SQL 的子集。
  • (OT) 作为第一步,删除或替换标识符中的破折号(例如带有下划线)。或引用它们。
  • @Milen:我做到了。我还将一些 varchars 更改为 nvarchars。
  • Postgres 中没有“nvarchar”类型。

标签: sql database postgresql ddl


【解决方案1】:

当您使用 varchar(4000) 等时,4000 实际上是字符串可以存在多长时间的概念最大值吗?还是您只是选择了“足够大”的东西?如果是第二个,只需使用 text 数据类型。它会一样快(实际上,稍微快一点,但您可能无法测量)。

sent_time 看起来应该是一个 timestamptz。不要将日期/时间存储在 varchar 中。

auto_increment 不在 postgres 中,请使用 serial 列。

您在标签和问题之间有一个循环引用,我确定您不是有意的。并且您对 Questions.question_id 的检查约束出现检查 user_id - 我敢打赌,复制/粘贴太多。

最后,不要使用大小写混合的标识符。一切都小写,所以你不必引用它们。例如,对列名和表名使用小写。

【讨论】:

  • 最后,不要使用大小写混合的标识符。全部小写,这样你就不必引用它们了。 --- 你的意思是我应该把CREATE TABLEUSER_IDNOT NULL 等命令改成小写?
  • 以下线程是基于您的最后一段:stackoverflow.com/questions/1199868/…
  • @Magnus:在哪些系统中使用大写时需要引用[列名和表名]
  • 我删除了主键表单标签(question_id)。 - Ken 说,如果你也使用表中的主键。它允许一个问题在线程stackoverflow.com/questions/1196873/… 上只有一个标签
  • 无需小写 CREATE TABLE 和 NOT NULL 部分。但是小写的USER_ID。我的经验是,大多数数据库在这种情况下都需要引用,如果你不引用,它们如何折叠的规则是不同的。坚持只使用小写(或只使用大写 - 这主要是一个偏好问题),然后从不引用它们是逃避处理它的好方法。
猜你喜欢
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多