2013-12-17 164 views
0

我想知道下面的MySQL是否正確。想知道SQL是否正確

特別是,我想,以確保以下幾點是正確的:

  • 的主鍵字段。
  • 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

也許試圖在這個特定情況下對「正確」這個術語進行闡述。 – DaGardner

+0

當你嘗試過時發生了什麼? – BWS

+0

SQL服務器之間的鍵語法不同。它似乎是mysql,因爲其他服務器沒有「auto_increment」關鍵字。在MySQL上,它似乎是正確的。 – peterh

回答

1

我會用VARCHAR(MAX)代替VARCHAR(500),除非有正當的理由,只支持500個字符建議的唯一的事情。這樣你不會經常用完存儲空間,你仍然可以使用像MID,LIKE等文本函數。

+0

謝謝!我認爲varchar並沒有爲每一行使用所有的保留空間,我不確定這一點。 – user1314836

+0

顯然VARCHAR(MAX)在MySQL中不起作用。我應該使用VARCHAR(65535)嗎? – user1314836

+0

@ user1314836對不起 - 我正在假設MSSQL。對於「自由文本」,500似乎有點小。你是正確的 - varchar只使用盡可能多的空間,因爲它需要。 –

1

你似乎是在MySQL中這樣做。

我注意到你的主題有一個層次結構。在MySQL中,管理這樣的層次結構是相當具有挑戰性的,然而人們經常這樣做。假設這些主題不會經常更改,我會建議將「主題」路徑作爲列。例如,如果主題是:

topic1 --> topic11 --> topic111 

然後路徑將會像「topic1/topic11/topic111」一樣。請注意,這是非規範化的,在不同行中重複相同的數據(主題)。如果主題和層次結構沒有真正更新(插入是可以的),它就可以工作。

一些額外的建議。當列引用id列時,將Id追加到名稱上。所以:ParentTopicId而不是ParentTopic; QuoteId而不是QuoteTopicId而不是Topic。這對您的數據尤其重要。當兩列在不同的表中有相同的名稱時,它們至少應該是相同的東西。然而,Topic是一個表格中主題的文本形式,但在另一個表格中是該主題的標識。

我傾向於在QuoteTopic中包含主鍵QuoteTopicId。例如,如果此表正在被另一個表引用,這將很有用。

而且,我懷疑你的數據結構缺少整個作者維度。引用是很有趣的,因爲誰說的。

最後,在大多數表格中,我喜歡將列CreatedByCreatedAt作爲自動填充列。在MySQL CreatedAt很容易添加使用時間戳。不幸的是,CreatedBy將需要一個觸發器,這是過度殺傷。

+0

這是MySQL,抱歉不提。我不明白爲什麼管理像我建議的挑戰那樣的層次結構。我將創建一個頁面,顯示帶有「頂級」主題的所有引用(這是一個沒有父主題的主題),並顯示其父是那一個的所有子主題。沒有別的,我相信這很容易處理PHP MySQL。所有其他建議都很好。非常感謝! – user1314836

+0

@ user1314836。 。 。等待,直到您想列出特定主題下的所有主題。或者,您想要在深度4處查找所有主題。或者確定主題層次結構中是否有循環。 MySQL不支持遞歸CTE,所以這樣的查詢比他們需要的更困難。 –

相關問題