将用户添加到不同的组

时间:2013-05-03 05:43:06

标签: php mysql

我有一个名为users的mySQL表。它有UID,评级,用户名,密码等等。

我的目标是建立一个类似于Facebook好友列表的系统(部落)。每个用户都可以查看用户的个人资料并将其添加到他们的部落。每个用户只是一个部落的首领,但可以成为他/她想成为的多个部落的村民。评级系统将考虑所有部落成员的评级。

在对关系数据库表和分组进行一些研究之后,我不清楚我应该如何设置表,或者与之相配的PHP代码。

如果有人能让我指出正确的方向,那就非常感激了!

编辑:我预见的一个重大问题是接受成为一个部落。我不确定你是怎么解释这个的。

2 个答案:

答案 0 :(得分:2)

听起来你需要两个课程:VillagerTribe

然后,如果这个人不是酋长,可能是一个名为chief_of的数据库字段或null,并且包含他们所属部落的名称。

在课程中,您可以使用getChiefOf()方法进行测试,以确定用户是否为校长。


或者,你可以有一个酋长表,由UID编制索引,同一列说明他们是哪个部落。效率稍低但结构更好。跳出来的一个缺点是,如果由于某种原因UID被更改,则必须更新两个表,所以可能第一个表更好。

答案 1 :(得分:2)

  类似于Facebook的好友列表。每个用户都可以查看用户的个人资料并将其添加到他们的部落。每个用户只是一个部落的首领

好的,所以你有一个User表,还需要一个Tribe表。

然后你描述的关系是chief-of,它是一对一的(一个用户可以是一个部落的首领;一个部落只有一个酋长),因此你可以将其存储在User(Chief_of:Tribe)或Tribe内(主要:用户)。

CREATE TABLE User ...
    chief_of integer

这里,chief_of可能是一个外键,因此如果你删除一个部落,相关的元组将其chief_of设置为NULL(用户不能成为不再存在的主管)部落)。

成员资格有点复杂,因为一个用户可以属于多个部落,而一个部落将拥有多个成员。

这是一种多对多关系,通常使用一个包含密钥对的表来完成:

CREATE TABLE member_of (
    user_id integer,
    tribe_id integer
);

这两个字段都是外键的自然候选字符。 Here您可以使用AuthorsBooks找到类似的实现。

要表明Bob是Cave Bear的Clan成员,您需要检索Bob和Bears的ID,并在member_of中插入一个元组。

要检索部落的所有成员,您可以使用JOIN:

SELECT Users.* FROM Users
    JOIN member_of ON (Users.user_id = member_of.user_id)
    WHERE member_of.tribe_id =
        (SELECT tribe_id FROM Tribes WHERE tribe_name = 'Clan of the Cave Bear');

我认为MySQL中的那个ON的较短版本是USING(user_id)(意味着两个表都具有相同的列相同名称),但在我看来ON更清楚。

您还可以检索虚拟“is_chief”列:

SELECT Users.*, chief_of = tribe_id AS is_chief FROM Users
    JOIN member_of ON (Users.user_id = member_of.user_id)
    WHERE member_of.tribe_id =
        (SELECT tribe_id FROM Tribes WHERE tribe_name = 'Clan of the Cave Bear');

chief_of属性等于部落ID的一个用户将is_chief设置为TRUE,等于1,所以

SELECT Users.*, chief_of = tribe_id AS is_chief FROM Users
    JOIN member_of ON (Users.user_id = member_of.user_id)
    WHERE member_of.tribe_id =
        (SELECT tribe_id FROM Tribes WHERE tribe_name = 'Clan of the Cave Bear')
    ORDER BY (chief_of = tribe_id) DESC, user_name;

将按字母顺序检索用户,但主管除外(如果有的话)将首先出现。

至于对部落的接受,这确定了三个状态:用户不在部落中,用户在部落中,用户被要求在一个部落。前两个实际上是同一属性member_of的两个面。很自然地,我们可以创建一个新属性并将其命名为wants_in。它将映射到与member_of相同的表。

一个酋长可以检索wants_in tribe_id等于他自己的chief_of的所有元组(所以如果它是NULL,意味着他是酋长,这将自动返回 nothing )。然后他可能会将此视为带有用户名的复选框表。当他批准加入时,对于每个批准,您都会从wants_in中删除该元组并将其放入member_of

或者您可能会认为“成员资格”本身就是一个州,因此您有一个更复杂的联接表

user_id,
tribe_id,
status

其中status可以是,

  • 没有(没有(U,T,?)元组):用户U和部落T彼此不知道
  • 100:用户U是部落T
  • 的正式成员
  • -1:部落T决定U不是的成员,甚至不能要求
  • 0:用户U想成为T
  • 的成员
  • 1-99:用户U是试用(学徒)成员。