我正在尝试为一个网站创建用户数据库,该网站将存储所有用户之间的相关值。我的意思是,对于每对用户,两个用户之间存在相关的存储值。
相关值将由PHP使用相关算法计算。我的问题是将它们存储在MySQL数据库中的最正确方法是什么?我意识到我可以制作这样一张桌子:
---------------------------------
| user1 | user2 | user3 | etc... |
-----------------------------------------
| user1 | #val | #val | #val | #val |
-----------------------------------------
| user2 | #val | #val | #val | #val |
-----------------------------------------
| user3 | #val | #val | #val | #val |
等等。但我不喜欢这种方法,因为
我有什么选择?如果这可以在MySQL中完成,我该如何解决呢?
如果在MySQL中无法做到这一点,我应该尝试学习其他数据库类型吗?例如,我意识到图形数据库系统可能适用于此,但我不想花时间学习如何使用图形数据库,如果这可以在MySQL中完成。
答案 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 * * * *
您可以通过这种方式在面向表的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
------------------------------------