1

我想制作一个应用程序,其中会有不同的用户,每个用户都会有一组朋友,这些朋友将被分类。会有一些默认类别,但用户可以添加自己的类别。我想知道哪种方法是最好的方法。

我的想法是有 3 个表 - 用户、朋友和类别。

用户表具有朋友和类别的字段(一对多)(但我不知道用户表是否需要有关朋友和类别的任何信息)。

朋友表有一个类别字段(一对多)和一个用户字段(多对一)。

类别表具有用户(多对多?)和朋友(多对多?)的字段。

我也不确定关系。我将 PHP 与 MySQL 以及 Symfony2 和 Doctrine2 一起使用。请帮忙!


编辑

也许我没有准确描述我需要什么。当您打开应用程序时,您会看到一个登录表单。如果您没有帐户,则应该注册 - 注册会创建一个新用户。该用户与其他用户没有联系(我还是编程新手,我想要一些更简单的东西,所以它就像电话簿一样)。每个用户都有一个朋友列表,朋友是表中的一行,其中包含姓名、地址、电话、电子邮件、照片、生日等字段,但它们是由当前用户添加的。朋友不是用户。每个用户实际上都是一个带有密码和用户名的帐户,当您登录时,只有一个朋友列表。因此,每个用户都为自己创建类别,而他与其他用户及其类别无关。该类别将只有 id 和 name。

所以这个想法是你创建一个帐户,然后创建一些类别并向他们添加朋友只是为了在你的朋友出生或他们居住的地方或他们的电话号码时有一个组织者,但你创建它们并添加有关的信息他们,他们是用户自己。它不像社交网络。只是一个笔记本,每个用户都可以在其中写下他朋友的信息。

4

2 回答 2

1

我可以为此建议设置下表(此方案也适用于电话簿或社交网络任务):

存储有关用户的所有信息的“用户”表:

  • 用户身份
  • 姓名
  • 电话
  • 地址
  • ...(任何其他领域)

存储关系类别信息的表“类别”:

  • 类别 ID
  • 姓名

存储有关用户之间关系的信息的“关系”表:

  • FirstUserId -> 链接到用户表
  • SecondUserId -> 链接到用户表
  • CategoryId -> 链接到类别表

因此,任何用户都可以添加新类别,然后在向另一个人添加新关系时引用它们。

如果您需要选择所有用户的朋友,您必须:

select fr.* from Relationships r join Users fr on r.SecondUserId = fr.UserId where r.FirstUserId = <Current user id>
于 2012-08-27T14:41:48.597 回答
1

首先,您需要了解交集表的作用:如果用户 A 将用户 B 标记为朋友(即与自身存在多对多关系user),并且您创建一个新表来表示该关系(表),有关此“友谊”的friends任何其他信息都应链接到该表。因此,如果用户以某种方式对他的朋友进行分类,则该类别适用于friends,而不适用于user。没有必要在此特定目的category之间建立关系。user

更新:由于朋友不是用户,因此该friends表不会是交集表(因此只有一个对 的引用user,表示“所有者”),但答案的其余部分仍然适用。

我假设每个类别将是category表中的一行。可能会添加有关该类别的其他信息,但应仅限于此。例如,如果您想知道哪个用户创建了一个类别,您可以添加一个外键来user标记例如“所有者”或“created_by”。如果一个用户创建的类别不被其他人看到,这可能很有用。

最后,您可以friendscategory. 如果用户 A 最多可以将用户 B 归入一个类别,那么来自friendsto的外键category就足够了(即一对多关系)。否则,您可能需要另一个多对多关系,因此应该创建一个额外的交集表(例如friend_category)。

您可以通过使用反规范化来避免这个额外的表,在friends其中两个用户相同(并且顺序相同)但类别不同的​​多行中(另请参见此示例)。这是否有利超出了此答案的范围,但恕我直言,现在使用额外的表更好(它可能看起来更复杂,但从长远来看会更容易维护)。(更新:如果friends不是交集表,这样的非规范化并不是一个真正的选择,所以坚持使用该friend_category表)

最后,您的布局将如下所示:

user              friends           friend_category   category
----              -------           ---------------   --------
(user fields) <-- user (owner)    <--  friend         (category fields)
                  (friend fields)      category   --> user (owner) --+
^                                                                    |
|                                                                    |
+--------------------------------------------------------------------+
于 2012-08-24T20:10:01.870 回答