Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 哪种方式是关联某些表的最佳方式?_Database_Doctrine Orm - Fatal编程技术网

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

Database 哪种方式是关联某些表的最佳方式?,database,doctrine-orm,Database,Doctrine Orm,我想做一个应用程序,其中将有不同的用户,每个用户将有一组朋友,这将被列入类别。将有一些默认类别,但用户可以添加自己的类别。我想知道哪种方法是最好的 我的想法是有3个表-用户,朋友和类别 用户表中包含用于好友和类别的字段(一对多)(但我不知道用户表是否需要任何关于好友和类别的信息) 朋友表中有一个类别字段(一对多)和一个用户字段(多对一) 类别表包含用户字段(多对多?)和朋友字段(多对多?) 我也不确定他们之间的关系。我将PHP与MySQL、Symfony2和Doctrine2一起使用。请帮忙

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

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

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

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

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

我也不确定他们之间的关系。我将PHP与MySQL、Symfony2和Doctrine2一起使用。请帮忙


编辑


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


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

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

更新:由于朋友不是用户,
朋友
表将不会是一个交集表(因此只有一个引用返回到
用户
,表示“所有者”),但其余答案仍然适用

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

最后,您可以将
朋友
类别
联系起来。如果用户A最多可以将用户B放入一个类别,那么从
朋友
类别
的外键就足够了(即一对多关系)。否则,您可能需要另一个多对多关系,因此应该创建一个额外的交集表(例如
friend\u category

您可以使用,在
friends
中有多行,其中两个用户相同(且顺序相同),但类别不同(另请参见),从而避免这个额外的表。这是否有利超出了这个答案的范围,但是IMHO现在使用额外的表更好(它可能看起来更复杂,但从长远来看更容易维护)。(Update:如果
friends
不是一个交集表,那么像这样去规范化并不是一个真正的选项,所以请坚持使用
friends\u类别
表)

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

user              friends           friend_category   category
----              -------           ---------------   --------
(user fields) <-- user (owner)    <--  friend         (category fields)
                  (friend fields)      category   --> user (owner) --+
^                                                                    |
|                                                                    |
+--------------------------------------------------------------------+
user friends\u类别
----              -------           ---------------   --------

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

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

  • 用户ID
  • 名字
  • 电话
  • 地址
  • 。。。(任何其他字段)
存储关系类别信息的表“类别”:

  • 类别
  • 名字
存储有关用户之间关系的信息的表“关系”:

  • FirstUserId->链接到用户表
  • SecondUserId->链接到用户表
  • 类别ID->链接到类别表
因此,任何用户都可以添加新类别,然后在向另一个人添加新关系时引用它们

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

select fr.* from Relationships r join Users fr on r.SecondUserId = fr.UserId where r.FirstUserId = <Current user id>
从关系r中选择fr.*在r.SecondUserId=fr.UserId上加入用户fr,其中r.FirstUserId=

这些“朋友”也是其他“用户”吗?或者在“朋友”中出现的人不是在“用户”中出现的人?朋友不是用户。事实上,每个用户都是一个有密码和用户名的帐户,当你登录时,只有一个朋友列表。朋友是姓名、电话、地址等的组合,但不是用户本身。谢谢你的回答!但也许我没有确切描述我需要什么。你能看一下编辑吗?T