2011-05-10 59 views
2

我有一個表格,包含用戶可以註冊的時隙。在管理端,管理員用戶可以選擇將兩個時隙「鏈接」在一起,這基本上對最終用戶說:'如果您註冊其中一個時隙,則必須註冊所有其他鏈接的時隙「。這些鏈接存儲在另一個有兩列的表中,一個是要求鏈接的時隙的ID,另一個是要鏈接到的時隙的ID。遞歸鏈接記錄

我怎樣才能使它與另一個時隙鏈接時,兩者取決於其他被選中。這需要對其他鏈接時隙進行遞歸,如下例所示:

Admin says: 

#1 is linked to #2 
#3 is linked to #2 

Therefore: 

#1 is linked to #2 
#2 is linked to #1 
#3 is linked to #2 
#2 is linked to #3 
#3 is linked to #1 
#1 is linked to #3 

要達到此目的的最佳方法是什麼?現在我試圖把這些信息放到鏈接表中,但是如果有另外一種方法可以用更多的PHP和更少的SQL來完成,那也可以。我會提供一個代碼示例,但我認爲這不會有幫助。

編輯:概念的答案很好。除非用於演示目的,否則我不需要爲我寫的代碼。

+0

它看起來像樹(在最少的單詞「'如果您註冊其中一個時隙,則必須註冊所有與其鏈接的其他時隙。')。 http://en.wikipedia.org/wiki/Tree_(data_structure) – 2011-05-10 20:50:53

+0

我也打算推薦一棵樹。 – 2011-05-10 20:52:24

+0

如果不需要從根到葉的完整路徑(因爲我只需要知道誰依賴於它),它看起來像一個不相交集數據結構(http://en.wikipedia.org/wiki/Disjoint-set_data_structure ) – 2011-05-10 21:09:01

回答

1

一種方法可能是一個由兩列組成的表格:Node_Id和Link_Id。

在這種情況下,Node_Id是Timeslot ID。對於上面的示例中,行是:

1 1 
2 1 
3 1 

其中,1,2,3中的第一列是時隙,和在第二個1是鏈接。

可以想像,讓我們添加的時隙4,5,6,7,和8的鏈節2,3和4。

4 2 
5 3 
6 2 
7 4 
8 2 

這轉化爲:

Pick 4, must also pick 6 and 8 (all are link 2). 
Pick 5, you're done (only member of link 3). 
Pick 6, must also pick 4 and 8 (all are link 2). 
Pick 7, you're done (only member of link 4). 
Pick 8, must also pick 4 and 6 (all are link 2). 
1

最簡單的方法可能是製作時隙組表。然後你會得到如下的東西:

TIMESLOT_GROUPS 
group_no group_label 
-------- ---------- 
1   whatever 


    TIME_GROUPS 
timeslot_no group_no 
----------- -------- 
1   1 
2   1 
3   1 

然後很容易看出哪些時隙與當前時隙相關。如果沒有關於分組的信息(標籤等)存儲,您實際上不需要timeslot_groups表。你只需要確保你的團隊號碼是唯一的。 (我的猜測是「時隙組」是一個「課程」或「班級」,所以你可能已經有了這張表)。