想知道SQL是否正确

时间:2013-12-17 23:07:35

标签: sql

我想知道以下MySQL是否正确。

特别是,我想确保以下几点是正确的:

  • 主键字段。
  • varchar(500)用于存储引用(例如,某些人的名言,如哲学家或政治家)。
  • 外部密钥。

非常感谢你!

CREATE TABLE quote (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    quote VARCHAR( 500 ) NOT NULL
);
CREATE TABLE topic (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    topic VARCHAR( 50 ) NOT NULL,
    parentTopic INT UNSIGNED,
    FOREIGN KEY (parentTopic) REFERENCES topic(id)
);
CREATE TABLE quoteTopics (
    quote INT UNSIGNED NOT NULL,
    topic INT UNSIGNED NOT NULL,
    PRIMARY KEY (quote, topic),
    FOREIGN KEY ( quote ) REFERENCES quote(id),
    FOREIGN KEY ( topic ) REFERENCES topic(id)
);

2 个答案:

答案 0 :(得分:1)

除非有正当理由支持500个字符,否则我建议使用VARCHAR(MAX)代替VARCHAR(500)。这样你就不会经常耗尽存储空间,你仍然可以使用MID,LIKE等文本功能。

答案 1 :(得分:1)

你似乎是在MySQL中这样做。

我注意到您的主题具有层次结构。在MySQL中,管理这样的层次结构非常具有挑战性,但人们常常这样做。假设主题不经常更改,我建议将“主题”路径作为列包含在内。例如,如果主题是:

topic1 --> topic11 --> topic111

然后路径就像“topic1 / topic11 / topic111”。请注意,这是非规范化的,在不同的行中重复相同的数据(主题)。如果主题和层次结构没有真正更新(插入正常),它就可以工作。

一些额外的建议。当列引用id列时,将Id附加到名称上。所以:ParentTopicId代替ParentTopic; QuoteId代替QuoteTopicId代替Topic。这对您的数据尤为重要。当两列在不同的表中具有相同的名称时,它们至少应该是相同的东西。但是,Topic是一个表中主题的文本形式,但是另一个表中主题的ID。

我倾向于在名为QuoteTopic的{​​{1}}中加入主键。例如,如果此表被另一个表引用,这将非常有用。

并且,我怀疑您的数据结构缺少整个作者维度。引用是有趣的,因为谁说了。

最后,在大多数表格中,我希望将列QuoteTopicIdCreatedBy作为自动填充列。在MySQL中CreatedAt很容易使用时间戳添加。不幸的是,CreatedAt需要一个触发器,这是过度的。