2011-05-10 57 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表。你只需要确保你的团队号码是唯一的。 (我的猜测是“时隙组”是一个“课程”或“班级”,所以你可能已经有了这张表)。