2012-06-06 92 views
0

我有一個名爲Project的表。爲了簡單起見,我們假設它有一個名爲projectId的列。SQL表設計

 
Projects 
--------- 
projectId PK 

我有另一張桌子。它被稱爲SubProjects。它有兩列,一列叫做projectId,另一列叫做subProjectId。這兩列構成了主鍵。

 
Sub Projects 
-------- 
projectId  PK 
subProjectId PK 

他們這樣工作的方式是你有一堆列在項目表中的項目。其中一些項目可以是項目的子項目。例如,如果項目表有3行類似項目1.本是其中子項目表進來這麼

 
Projects 
------- 
projectId 
    1 
    2 
    3 

項目2和3,可考慮分項目。爲了表示這一點,子項目應該是這樣的

 
Sub Projects 
-------- 
1 ,2 
1 ,3 

這意味着項目2和項目3項目1的子項目

我有創造這個模型的問題。在SubProjects表中,我需要projectId和subProjectId引用Projects表中的projectId。但關鍵的是他們可以參考不同的項目。我建議我應該用foregin鍵來做這件事?這有意義嗎?這是否允許?有一個更好的方法嗎?

我正在使用MySql和MySql工作臺,但似乎不能解決這個問題。有任何想法嗎?

編輯 項目可以是多個表的子項目。

+0

是的,你的'Sub_Project'表應該使用(非空)外鍵。這種關係與樹型結構通常在數據庫中完成的方式有些「倒退」,但應該沒問題(因爲像一些答案指出的那樣,通常你存儲'my-parent-is',而不是'my-child-是)。但是,由於缺乏遞歸數據結構(大多數其他主要的RDBMS可以本機地在一條語句中檢索整個樹),您可能很難在mySQL中漫遊樹。 –

+0

每個ProjectId和SubProjectId將需要FK到Project.ProjectId。另外,請注意循環的父母/子女關係。即。 1,2然後2,1。 –

回答

1

這樣做應該沒問題。你能更具體地說明你爲什麼不能設置它嗎?

如果一個項目只是一個項目的一個子項目,另一種方法是將一個「父項目」列添加到項目表中,FK指向「本身」。如果你這樣做,我認爲你的查詢很可能會變得更簡單。

+0

不幸的是,它可能是許多項目的子項目。謝謝你的幫助。生病後,我試圖執行在一秒鐘的SQL。 – user489041

0

我將創建使用分層列,如一個表:

project_id parent_project_id 
------------------------------- 
1    null 
2    1 
3    1 

然後,你可以說,如果一個項目的parent_project_id爲空,它不是任何其他項目的一個子項目。否則,該項目是parent_project_id中所列項目的子項目。

0

爲什麼不在表Project中添加一個名爲ParentProjectID的新字段。對於項目,它將爲null,對於子項目,它將在其中具有其父項目ID。

+0

項目可以是多個項目的子項目。假設有3個項目名稱爲1,2,3。 3可能是1和2的子項目。所以它會有多個父項目。我不知道這種方法在這種情況下是否可行。 – user489041

+0

一個項目可以有多個子項目嗎?如果否,則添加一列SubProjectID。因此,項目1,2,3將如下所示:1與sub作爲3,2與sub作爲3,3與無子。 – Farhan

0

您如何考慮創建一個具有層次結構的表?使用您例如,它會是這樣

Projects 
---------- 

ProjectID | ParentID 
----------|---------- 
    1  | NULL 
    2  | 1 
    3  | 1 
+0

是的,但唯一的問題是,它限制一個項目只能是一個項目的子項目。如果有一個名爲4的項目,我希望它是一個2和3的子項目。 – user489041

0

您可以在「子項目」,指回在「項目」表中的專案編號列添加外鍵約束,以兩列。這樣做不會強制兩列在「子項目」中的行上具有相同的值。當您插入新行「子項目」(可以說2,3),服務器將檢查:

  • 那有在項目表中的行具有專案編號值2
  • 那有在項目表中的行具有專案編號值3
  • 的存在是不是已經在「子項目」

這種模型可以工作,但它並不能保證在同一行,該項目的層次結構是「理智的」。數據庫本身沒有任何東西阻止你將(2,3)和(3,2)插入到「子項目」表中。或(1,1)。所以你將不得不在你的應用程序邏輯中強制執行。