真的没有正确或错误的方法,它是你决定使用什么,归根结底它是你的代码,所以无论你选择什么并为你工作。
但是,您说得很对,输入两行将是一个非常沉重的开销,并且似乎没有充分的理由使用额外的空间。更简单的是,您可以在数据库中设置另一列:
user_1 | user_2 | accept_code | accepted
user_1 请求将 user_2 添加为好友 - 您设置了 accept_code 在数据库中创建条目。将您的数据库结构设置为将accepted 列设置为define as false。然后当第一次创建行时,用户当前不是朋友。
使用你的例子:鲍勃请求弗雷德作为朋友。你的数据库现在看起来像这样:
bob | fred | 123123 | false
当user_2进入accept_code时,将accepted改为true。
bob | fred | 123123 | true
这样,一个查询将告诉您这两个用户是否是朋友,而不是两个查询来查看您是否有两个匹配的数据库条目。
例如,bob 已将 fred、joe 和 alex 添加为好友,fred 和 alex 已接受 bob 作为好友,但 joe 没有。你的数据库看起来像这样:
user_1 | user_2 | accept_code | accepted
bob | fred | 123123 | true
bob | joe | 321321 | false
bob | alex | 789789 | true
因此,例如,一个伪选择可能会找到 bob 的所有朋友:
SELECT user_2 FROM relationships WHERE user_1="bob" AND accepted="true"
结果是:
fred
alex
根据 cmets 更新:
数据库结构:
user_1 | user_2 | accept_code | accepted
bob | fred | 123 | true
bob | alex | 123 | true
bob | joe | 123 | false
ste | bob | 123 | true
joe | alex | 123 | true
选择语句:
SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'current_user' OR user_2 = 'current_user');
示例 1 - bob 登录,他已请求好友并被请求为好友:
SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'bob' OR user_2 = 'bob');
结果:
bob | fred | 123 | accepted
bob | alex | 123 | accepted
ste | bob | 123 | accepted
示例 2 - alex 登录,他从未请求过好友但已被请求为好友:
SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'alex' OR user_2 = 'alex');
结果:
bob | alex | 123 | accepted
joe | alex | 123 | accepted
示例 3 - joe 登录,他请求了一个朋友并拒绝了一个朋友:
SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'joe' OR user_2 = 'joe');
结果:
joe | alex | 123 | accepted