我有一个名为users的mySQL表。它有UID,评级,用户名,密码等等。
我的目标是建立一个类似于Facebook好友列表的系统(部落)。每个用户都可以查看用户的个人资料并将其添加到他们的部落。每个用户只是一个部落的首领,但可以成为他/她想成为的多个部落的村民。评级系统将考虑所有部落成员的评级。
在对关系数据库表和分组进行一些研究之后,我不清楚我应该如何设置表,或者与之相配的PHP代码。
如果有人能让我指出正确的方向,那就非常感激了!
编辑:我预见的一个重大问题是接受成为一个部落。我不确定你是怎么解释这个的。答案 0 :(得分:2)
听起来你需要两个课程:Villager
和Tribe
。
然后,如果这个人不是酋长,可能是一个名为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您可以使用Authors
和Books
找到类似的实现。
要表明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
可以是,