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

时间:2013-05-01 23:59:10

标签: php mysql

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

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

         ---------------------------------
        | user1 | user2 | user3 | etc... |
 -----------------------------------------
| user1 | #val  | #val  | #val  | #val   |
 -----------------------------------------
| user2 | #val  | #val  | #val  | #val   |
 -----------------------------------------
| user3 | #val  | #val  | #val  | #val   |

等等。但我不喜欢这种方法,因为

  • 它存储两次值;例如,user1和user3之间的相关性存储在第1行第3列以及第3行第1列。
  • 我使用预准备语句,这意味着我不能选择以用户ID命名的列,除非我将用户ID连接到SQL语句中,这显然不是理想的。

我有什么选择?如果这可以在MySQL中完成,我该如何解决呢?

如果在MySQL中无法做到这一点,我应该尝试学习其他数据库类型吗?例如,我意识到图形数据库系统可能适用于此,但我不想花时间学习如何使用图形数据库,如果这可以在MySQL中完成。

3 个答案:

答案 0 :(得分:1)

通常你会在JOIN表中做这样的事情。因此,假设您有一个users表,其中包含user_id字段以及您需要的任何其他字段。您可以构建一个名为user_relations或类似的表,它只有两个user_id外键字段,以某种方式关联用户。

user_id_1  |   user_id_2
------------------------
1          |   2
1          |   3
2          |   1
3          |   1
...        |   ...

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

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

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的关系在样本行值中的两个方向上显示。

答案 1 :(得分:1)

很棒的问题。

根据用户A,B,C,D和E,您的数据集是三角形的;

  A B C D E
A   
B *  
C * *
D * * *
E * * * *
  1. 在上述矩阵AA中,BB,CC,DD和EE无意义。
  2. 为避免重复,AB与BA相同。 CD与DC相同,依此类推。
  3. 您可以通过这种方式在面向表的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
    

答案 2 :(得分:0)

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

UserRelations:

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