我想知道以下MySQL是否正确。
特别是,我想确保以下几点是正确的:
非常感谢你!
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)
);
答案 0 :(得分:1)
除非有正当理由支持500个字符,否则我建议使用VARCHAR(MAX)
代替VARCHAR(500)
。这样你就不会经常耗尽存储空间,你仍然可以使用MID,LIKE等文本功能。
答案 1 :(得分:1)
你似乎是在MySQL中这样做。
我注意到您的主题具有层次结构。在MySQL中,管理这样的层次结构非常具有挑战性,但人们常常这样做。假设主题不经常更改,我建议将“主题”路径作为列包含在内。例如,如果主题是:
topic1 --> topic11 --> topic111
然后路径就像“topic1 / topic11 / topic111”。请注意,这是非规范化的,在不同的行中重复相同的数据(主题)。如果主题和层次结构没有真正更新(插入正常),它就可以工作。
一些额外的建议。当列引用id列时,将Id
附加到名称上。所以:ParentTopicId
代替ParentTopic
; QuoteId
代替Quote
和TopicId
代替Topic
。这对您的数据尤为重要。当两列在不同的表中具有相同的名称时,它们至少应该是相同的东西。但是,Topic
是一个表中主题的文本形式,但是另一个表中主题的ID。
我倾向于在名为QuoteTopic
的{{1}}中加入主键。例如,如果此表被另一个表引用,这将非常有用。
并且,我怀疑您的数据结构缺少整个作者维度。引用是有趣的,因为谁说了。
最后,在大多数表格中,我希望将列QuoteTopicId
和CreatedBy
作为自动填充列。在MySQL中CreatedAt
很容易使用时间戳添加。不幸的是,CreatedAt
需要一个触发器,这是过度的。