哪些是关联某些表的最佳方式?

时间:2012-08-22 06:48:07

标签: database doctrine-orm

我想创建一个应用程序,其中将有不同的用户,每个用户将有一组朋友将被分类。将有一些默认类别,但用户将能够添加自己的类别。我想知道哪种方法最好。

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

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

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

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

我也不确定这种关系。我正在使用PHP和MySQL以及Symfony2和Doctrine2。请帮忙!


修改

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

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

2 个答案:

答案 0 :(得分:1)

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

更新,因为朋友不是用户,friends表将不是交集表(因此只有一个引用返回user,表示“所有者” “),但其余的答案仍然适用。

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

最后,您可以将friendscategory联系起来。如果用户A可以将用户B放在最多一个类别中,则从friendscategory的外键应该足够(即一对多关系)。否则,您可能需要另一个多对多关系,因此应创建一个额外的交集表(例如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)

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

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

  • 用户ID
  • 名称
  • 电话
  • 地址
  • ......(任何其他领域)

表格“类别”,用于存储有关关系类别的信息:

  • 类别ID
  • 名称

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

  • FirstUserId - &gt;链接到用户表
  • SecondUserId - &gt;链接到用户表
  • CategoryId - &gt;链接到类别表

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

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

select fr.* from Relationships r join Users fr on r.SecondUserId = fr.UserId where r.FirstUserId = <Current user id>