真的没有正确或错误的方式,这是你决定使用的,在一天结束时它是你的代码,所以无论你选择什么,为你工作.
但是,你是完全正确的,进入两行将是一个非常沉重的开销,并使用额外的空间看似没有充分的理由.更简单的是,您可以在数据库中设置另一列:
user_1 | user_2 | accept_code |公认
user_1请求将user_2添加为好友 – 您设置了一个accept_code,在DB中创建一个条目.设置数据库结构以将接受列设置为false.然后,当首次创建行时,用户当前不是朋友.
使用你的例子:bob请求fred作为朋友.你的数据库现在看起来像这样:
鲍勃|弗雷德| 123123 |假
当user_2输入accept_code时,则将accepted更改为true.
鲍勃|弗雷德| 123123 |真正
这样,一个查询将告诉您这两个用户是否是朋友,而不是两个查询,以查看您是否有两个匹配的数据库条目.
因此,例如,鲍勃已经添加了弗雷德,乔和亚历克斯作为朋友,弗雷德和亚历克斯已经接受鲍勃作为朋友,但乔没有.你的数据库看起来像这样:
user_1 | user_2 | accept_code |公认
鲍勃|弗雷德| 123123 |真正
鲍勃|乔| 321321 |假
鲍勃|亚历克斯| 789789 |真正
所以例如,一个假的选择也许,找到bob的所有朋友:
SELECT user_2 FROM relationships WHERE user_1 =“bob”AND accepted =“true”
结果将是:
弗雷德
亚历克斯
根据评论更新:
数据库结构:
user_1 | user_2 | accept_code |公认
鲍勃|弗雷德| 123 |真正
鲍勃|亚历克斯| 123 |真正
鲍勃|乔| 123 |假
ste |鲍勃| 123 |真正
乔|亚历克斯| 123 |真正
选择声明:
SELECT * FROM relationships WHERE accepted =’true’AND(user_1 =’current_user’或user_2 =’current_user’);
示例1 – bob登录,他已经请求了朋友并被要求作为朋友:
SELECT * FROM relationships WHERE accepted =’true’AND(user_1 =’bob’或user_2 =’bob’);
结果:
鲍勃|弗雷德| 123 |公认
鲍勃|亚历克斯| 123 |公认
ste |鲍勃| 123 |公认
示例2 – alex登录,他从未请求和朋友,但已被要求作为朋友:
SELECT * FROM relationships WHERE accepted =’true’AND(user_1 =’alex’或user_2 =’alex’);
结果:
鲍勃|亚历克斯| 123 |公认
乔|亚历克斯| 123 |公认
示例3 – joe登录,他已经请求了一位朋友并拒绝了一位朋友:
SELECT * FROM relationships WHERE accepted =’true’AND(user_1 =’joe’或user_2 =’joe’);
结果:
乔|亚历克斯| 123 |公认