Php 向不同组添加用户
我有一个名为users的mySQL表。它有UID、等级、用户名、密码等 我的目标是创建一个类似于Facebook好友列表的系统(部落)。每个用户都可以查看用户的个人资料并将其添加到他们的部落中。每个用户只能是一个部落的首领,但可以是他/她想要成为的任意多个部落的村民。评级系统将考虑部落所有成员的评级 在对关系数据库表和分组进行了一些研究之后,我不清楚应该如何设置表,或者如何设置与之配套的PHP代码 如果有人能给我指出正确的方向,我将不胜感激Php 向不同组添加用户,php,mysql,Php,Mysql,我有一个名为users的mySQL表。它有UID、等级、用户名、密码等 我的目标是创建一个类似于Facebook好友列表的系统(部落)。每个用户都可以查看用户的个人资料并将其添加到他们的部落中。每个用户只能是一个部落的首领,但可以是他/她想要成为的任意多个部落的村民。评级系统将考虑部落所有成员的评级 在对关系数据库表和分组进行了一些研究之后,我不清楚应该如何设置表,或者如何设置与之配套的PHP代码 如果有人能给我指出正确的方向,我将不胜感激 编辑:我预见到的一个大问题是接受加入一个部落。我不知道
编辑:我预见到的一个大问题是接受加入一个部落。我不知道你是怎么解释的。听起来你需要两门课:
村民和部落
然后,可能是一个名为chief\u of
的数据库字段,或者如果此人不是酋长,则该数据库字段为null
,并包含他们是酋长的部落名称
在这些类中,您可以使用getChiefOf()
方法来测试用户是否是主管
或者,你也可以有一个酋长表,按UID索引,并有相同的列说明他们是哪个部落的酋长。效率稍低,但结构更好。突然想到的一个缺点是,如果出于某种原因更改了UID,则必须更新两个表,因此第一个表可能更好。听起来您需要两个类:Villager
和Tribe
然后,可能是一个名为chief\u of
的数据库字段,或者如果此人不是酋长,则该数据库字段为null
,并包含他们是酋长的部落名称
在这些类中,您可以使用getChiefOf()
方法来测试用户是否是主管
或者,你也可以有一个酋长表,按UID索引,并有相同的列说明他们是哪个部落的酋长。效率稍低,但结构更好。突然想到的一个缺点是,如果出于某种原因更改了UID,则必须更新两个表,因此第一个表可能更好
类似于Facebook的好友列表。每个用户都可以查看用户的个人资料并将其添加到他们的部落中。每个用户都是一个部落的首领
好的,您有一个用户
表,还需要一个部落
表
然后,您描述的关系是一对一的部落首领(一个用户可以是一个部落的首领;一个部落只有一个首领),因此您可以将其存储在用户(部落首领)或部落(部落首领:用户)中
在这里,chief\u of
可能是一个外键,因此如果删除一个部落,相关元组的chief\u of
将设置为NULL(用户不能是不再存在的部落的首领)
成员资格有点复杂,因为一个用户可以属于多个部落,而一个部落将有多个成员
这是一种多对多关系,通常通过一个包含键对的表来实现:
CREATE TABLE member_of (
user_id integer,
tribe_id integer
);
这两个字段都是外键的自然候选字段。您可以使用作者
和书籍
找到类似的实现
要指示Bob是洞穴熊氏族的成员,请检索Bob和Bears的ID,并在
的member\u中插入一个元组
要检索氏族的所有成员,可以使用联接:
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上的较短版本是使用(user_id)
(这意味着两个表都有一个同名的列),但我认为上的更清晰
您还可以检索虚拟的“is_chief”列:
其chief\u of
属性等于部落id的一个用户将is\u 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;
将按字母顺序检索用户,但负责人除外,负责人(如果在场)将排在第一位
至于加入部落,这确定了三种状态:用户不在部落,用户在部落,用户被要求加入部落。前两个实际上是同一属性的两个面成员
。因此,我们很自然地会创建一个新属性,并在
中将其称为wants\u。它将映射到与
的成员\u相同的表
酋长可以在
中检索其部落id
等于他自己的
酋长的wants_的所有元组(因此,如果为NULL,表示他不是酋长,则自动不返回任何内容)。然后他可能会将其视为带有用户名的复选框表。当他批准加入时,对于每次批准,您都会从
中的wants\u中删除元组,并将其放入
的member\u中
或者您可以决定“成员资格”本身就是一种状态,这样您就有了一个更复杂的联接表
user_id,
tribe_id,
status
其中,状态
可以是
- nothing(没有(U,T,?)元组):用户U和部落T彼此未知
- 100:用户U是部落T的正式成员
- -1:部落T已经决定U不是成员,甚至不能要求成为成员
- 0:用户U希望成为T的成员
- 1-99:用户U是试用(学徒)成员
类似于Facebook的好友列表。每个用户都可以查看用户的个人资料并将其添加到他们的部落中。每个用户都是一个部落的首领
好的,您有一个用户
表,还需要一个部落
表
然后您描述的关系是
的首领,这是一对一(一个用户可以是一个部落的首领;一个部落只有一个首领),因此您可以
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;
user_id,
tribe_id,
status