2013-05-15 34 views
0

我需要創建一個跟蹤項目的應用程序。所以我有許多項目,每個項目都有ID,名稱和所有者等屬性。每個項目都有很多任務。每個任務都有屬性,如ID,名稱,完成狀態,優先級和所有者。數據庫設計;動態創建表格

現在,當我爲這個應用程序設計一個DB時,想到了兩種可能的設計。我不知道哪一個是更好的設計。如果你能讓我知道下面的設計中更好的設計,那就太好了,請不要忘記提到爲什麼一個人比另一個更好。

以下是方法。

方法1.在DB中有2個表。一個是項目表,另一個是任務表。任務表將有一個用於項目ID的外鍵,該外鍵將特定任務鏈接到它所屬的項目。這種方法與其他方面的基本區別在於,所有任務不論它屬於哪個項目,都將存儲在一個並且只有一個表中,其長度可以無限增長。

方法2.有一個Project表,並且對於每個項目,動態創建一個僅包含該項目任務的表。因此,將有多少個任務表與項目表中的行數一樣多。可能存在一種算法,我們可以通過該算法得到動態創建的表的名稱。當我們想要查詢它時,可以使用這個邏輯來獲取特定表的名稱。即使看起來很麻煩,我在這種方法中看到的優點是,一個特定項目的所有任務只能在一個表中,其長度不會失控(至少不會像上述情況那樣)。但是桌子的數量可能無限增長。

回答

3

方法1更好。您不想爲每個項目創建一個表格。這是反規範化。您的表看起來像:

(僞代碼)

CREATE TABLE project (
    projectId int NOT NULL PRIMARY KEY 
    name varchar, 
    owner varchar); 

CREATE TABLE task (
    taskId int AUTO_INCREMENT PRIMARY KEY, 
    projectId int NOT NULL, 
    name varchar, 
    completionStatus varchar, 
    priority int, 
    owner varchar, 
    FOREIGN KEY projectId 
    REFERENCES project.projectId) 
+0

我完全同意方法2時壞。然而,將其稱爲「反規範化」是對「規範化」一詞的鬆散使用。在這裏玩哪種正常形式? 1NF,2NF,3NF,BCNF,4NF,5NF,6NF或DKNF? –

+1

方法2可能是一個明智的選擇嗎? – OneRandomCoder

+1

@ user2386512號碼 – Kermit