Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
如何使用MySQL和PHP在数据库中存储用户之间的关联值?_Php_Mysql - Fatal编程技术网

如何使用MySQL和PHP在数据库中存储用户之间的关联值?

如何使用MySQL和PHP在数据库中存储用户之间的关联值?,php,mysql,Php,Mysql,我正在尝试为一个网站建立一个用户数据库,该数据库将存储所有用户之间的相关值。我的意思是,对于每一对用户,这两个用户之间都有一个相关的存储值 相关值将由PHP使用相关算法计算。我的问题是,在MySQL数据库中存储它们的最正确方法是什么?我意识到我可以做一张这样的桌子: --------------------------------- | user1 | user2 | user3 | etc... | -----------------------------

我正在尝试为一个网站建立一个用户数据库,该数据库将存储所有用户之间的相关值。我的意思是,对于每一对用户,这两个用户之间都有一个相关的存储值

相关值将由PHP使用相关算法计算。我的问题是,在MySQL数据库中存储它们的最正确方法是什么?我意识到我可以做一张这样的桌子:

         ---------------------------------
        | user1 | user2 | user3 | etc... |
 -----------------------------------------
| user1 | #val  | #val  | #val  | #val   |
 -----------------------------------------
| user2 | #val  | #val  | #val  | #val   |
 -----------------------------------------
| user3 | #val  | #val  | #val  | #val   |
SELECT u1.*, u2.*
FROM
  users AS u1
  INNER JOIN user_relations AS ur
    ON u1.user_id = ur.user_id_1
  INNER JOIN users AS u2
    ON ur.user_id_2 = u2.user_id
WHERE u1.user_id = ? /* or whatever filter you may need to apply */
等等。但我不喜欢这种方法,因为

  • 它将每个值存储两次;例如,user1和user3之间的相关性存储在第1行第3列以及第3行第1列中
  • 我使用准备好的语句,这意味着我不能选择以用户ID命名的列,除非我将用户ID连接到SQL语句中,这显然是不理想的
我的选择是什么?如果这可以在MySQL中很好地完成,我该怎么做呢


如果MySQL不能很好地实现这一点,那么还有其他数据库类型需要我学习吗?例如,我意识到一个图形数据库系统可以很好地实现这一点,但如果可以在MySQL中实现,我不想花时间学习如何使用图形数据库。

在我看来,最好的解决方案是有两个表。。。用户和用户关系

用户关系:

====================================
User1Field | User2Field | ValueField
====================================
#User      | #User      | #val
------------------------------------
#User      | #User      | #val
------------------------------------
#User      | #User      | #val
------------------------------------

通常,您会在联接表中执行类似的操作。假设您有一个
users
表,其中有一个
user\u id
字段和您需要的任何其他字段。您可以构建一个名为
user\u relations
或类似的表,该表只包含两个user\u id外键字段,以某种方式将用户关联起来

user_id_1  |   user_id_2
------------------------
1          |   2
1          |   3
2          |   1
3          |   1
...        |   ...
然后,您将在两个列上都有一个复合主键,以强制执行唯一性。请注意,我假设您在问题中提到的
#val
只是表示关系存在的某种标志(1/0)。如果您确实需要该值来解释有关关系的某些内容(即父/子或其他有意义的值),那么您可以向该表添加第三列来存储与该关系相关的值

当您需要跨关系进行查询时,可以这样做:

         ---------------------------------
        | user1 | user2 | user3 | etc... |
 -----------------------------------------
| user1 | #val  | #val  | #val  | #val   |
 -----------------------------------------
| user2 | #val  | #val  | #val  | #val   |
 -----------------------------------------
| user3 | #val  | #val  | #val  | #val   |
SELECT u1.*, u2.*
FROM
  users AS u1
  INNER JOIN user_relations AS ur
    ON u1.user_id = ur.user_id_1
  INNER JOIN users AS u2
    ON ur.user_id_2 = u2.user_id
WHERE u1.user_id = ? /* or whatever filter you may need to apply */
请注意,根据您试图表示的关系类型(即双向关系),表中可能需要两行来表示每个关系。这样,您就可以始终使用第一列在第二列中查找所有相关用户。这在我上面的示例中显示,其中用户1的关系在示例行值的两个方向上显示。

给定用户A、B、C、D和E,您的数据集是三角形的

  A B C D E
A   
B *  
C * *
D * * *
E * * * *
  • 在上述矩阵中,AA、BB、CC、DD和EE无意义
  • 为避免重复,AB与BA相同。CD与DC相同,依此类推
  • 您可以用这种方式将三角形数据集保存在面向表的SQL数据库中

    id usr usr c
    ------------
    0  A   B   1
    1  A   C   5
    2  A   D   3
    3  A   E   4
    4  B   C   3
    

    etc

    阅读数据库规范化,它将帮助您了解如何将实体拆分为表。因此,如果我理解正确,表中的每一行代表两个用户的关系?这是一种特别“正确”的方法吗?@VijayRamamurthy是的,你理解正确。这绝对是规范化此类关系数据的首选方法。对于每个关系,您可能需要两行数据,而不是一行(请参阅我在上面的回答中添加的注释)。另一种选择是,如果每个用户最多有一个关系,只需在用户表中添加一个关系列,然后进行自联接(您有时会看到这样做是为了在树结构的关系表示中表示父关系)。我将在此表中存储十进制值,每个值都在0和1之间。所以我会用你的第二种方法。我的主要问题是关于效率。与图形数据库相比,这种方法在数据存储或计算时间方面是否效率低下?@VijayRamamurthy总是很难给出关于性能的明确答案。因为有许多变量在起作用,包括硬件、数据访问模式等。如果您的字段上有适当的索引来匹配查询,分配了足够的内存来将索引完全存储在内存中,并且您没有处理这些表上的数亿行,我注意到的一点是,每个相关性存储两次;例1到3在第二和第四位。有没有办法绕过这个问题?我知道我可以只存储一次,但我该如何查询呢?您的答案与Mike Brant的答案非常相似-我只是想知道这种方法是否被认为是不合法的。我在MySQL方面没有太多经验,所以这可能是一种有效的方法;我只是想知道,学习一个图形数据库系统是否会更好,以避免效率低下。这是在关系数据库上做这件事的正确(或大多数用户)方法。。。如果你能改变DB电机。。。你应该像MongoDB一样使用NoSQL…我考虑过这一点,但在MySQL中这真的很混乱。它有什么混乱之处?你的意思是处理它的代码在某种程度上是混乱的吗?是的,这就是我的意思-我认为它必须涉及到连接到SQL查询中。除非你知道另一种选择?