我想创建一个应用程序,其中将有不同的用户,每个用户将有一组朋友将被分类。将有一些默认类别,但用户将能够添加自己的类别。我想知道哪种方法最好。
我的想法是拥有3个表 - 用户,朋友和类别。
用户表包含朋友和类别的字段(一对多)(但我不知道用户表是否需要有关朋友和类别的任何信息)。
friends表有一个类别(一对多)字段和一个用户字段(多对一)。
类别表包含用户(多对多?)和朋友(多对多?)的字段。
我也不确定这种关系。我正在使用PHP和MySQL以及Symfony2和Doctrine2。请帮忙!
修改
也许我没有准确描述我的需要。当您打开应用程序时,您会看到一个登录表单。如果您没有帐户,则应注册 - 注册会创建新用户。这个用户没有与其他用户连接(我还是新手编程,我想要一些更简单的东西,所以它就像电话簿)。每个用户都有一个朋友列表,一个firend是一个表格中的一行,其中包含姓名,地址,电话,电子邮件,照片,生日等字段,但它们是由当前用户添加的。朋友不是用户。事实上,每个用户都是一个拥有密码和用户名的帐户,当您登录时,只有一个朋友列表。因此,每个用户为自己创建类别,他与其他用户及其类别无关。该类别将只有id和name。
所以我的想法是你创建一个帐户,然后创建一些类别并添加朋友,只是为了在你的朋友出生或他们居住的地方有一个组织者,或者是他们的电话号码,但你创建并添加关于他们的信息,他们是对用户自己。它不像社交网络。只是一个笔记本,每个用户都可以写下他朋友的信息。
答案 0 :(得分:1)
首先,您需要了解intersection tables的作用:如果用户A将用户B标记为朋友(即user
与自身之间存在多对多关系),并且您创建一个新表来表示该关系(friends
表),有关此“友谊”的任何其他信息都应链接到该表。因此,如果用户以某种方式对其朋友进行分类,则该类别适用于friends
,而不适用于user
。对于此特定目的,category
和user
之间不需要关系。
更新,因为朋友不是用户,friends
表将不是交集表(因此只有一个引用返回user
,表示“所有者” “),但其余的答案仍然适用。
我假设每个类别都是category
表中的一行。可能会添加有关类别的其他信息,但应限于此。例如,如果您想知道哪个用户创建了一个类别,您可以将外键添加到标记为“owner”或“created_by”的user
。如果一个用户创建的类别不被其他人看到,那么这可能很有用。
最后,您可以将friends
与category
联系起来。如果用户A可以将用户B放在最多一个类别中,则从friends
到category
的外键应该足够(即一对多关系)。否则,您可能需要另一个多对多关系,因此应创建一个额外的交集表(例如friend_category
)。
您可以使用denormalization来避免这个额外的表,friends
中有多个行,其中两个用户是相同的(并且顺序相同)但类别不同(另请参阅{{3 }})。这是否有利超出了这个答案的范围,但恕我直言使用额外的表现在更好(它可能看起来更复杂,但从长远来看,它将更容易维护)。 (更新:如果friends
不是交叉表,那么非常规化就不是一个选项,所以坚持friend_category
表)
最后,您的布局将如下所示:
user friends friend_category category
---- ------- --------------- --------
(user fields) <-- user (owner) <-- friend (category fields)
(friend fields) category --> user (owner) --+
^ |
| |
+--------------------------------------------------------------------+
答案 1 :(得分:1)
我可以为此建议以下表格(此方案也适用于电话簿或社交网络任务):
表“用户”,用于存储有关用户的所有信息:
表格“类别”,用于存储有关关系类别的信息:
表“关系”,用于存储有关用户之间关系的信息:
因此,任何用户都可以添加新类别,然后在向其他人添加新关系时引用它们。
如果您需要选择所有用户的朋友,则必须:
select fr.* from Relationships r join Users fr on r.SecondUserId = fr.UserId where r.FirstUserId = <Current user id>