gpt4 book ai didi

mysql - 在 mysql 数据库中存储友谊协会的正确方法是什么

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:20 25 4
gpt4 key购买 nike

我想创建一个表,我的用户可以在其中关联彼此之间的友谊。同时,该表将与我试图建立的各种其他表之间的一对多关系结合使用。

我现在正在想这样的事

member_id, friend_id, active, date

member_id 将是调用电话的用户的列,friend_id 将是他们试图联系的 friend 的列,active 将是各种切换 0 = pending,1 = active,date 只是一个该特定行上最后一次事件的记录日期。

现在我的困惑是,如果我要查询,我通常会查询 member_id,然后将其余查询基于关联的 friend_id,以相应地向正确的人显示数据。因此,考虑到这种逻辑,这让我觉得每个请求必须有 2 行。一个是请求的 member_id 和插入表中的请求的 friend_id,另一个是相反的,这样我每次都可以相应地查询。因此,从本质上讲,对于向该特定表请求的每个操作,它就像双重浸入一样,我需要进行 2 个类似的操作才能使其工作。就优化而言,这对我来说完全没有意义。所以在我所有的问题中,处理这种关系数据的正确方法是什么?还是我真的在理智地思考这是一种处理它的方法?

最佳答案

如果友谊总是是相互的,那么您可以选择数据冗余(即两个方向都有一行)以实现更简单的查询,或者学习接受稍微复杂一点的查询。除非有令人信服的理由,否则我个人会避免数据冗余——你不仅在浪费空间和性能,而且在执行它时需要小心——一个简单的 CHECK 不能引用其他行并且取决于你的DBMS 触发器可能受限于它可以对可变表执行的操作。

确保每个友谊只有一行的简单方法是始终在 member_id 中插入较低的值和更高的值(value) friend_id (做一个约束 CHECK (member_id < friend_id) 来强制执行它)。然后,当您查询时,您将进行双向搜索 - 例如,查找给定人员(由 person_id 标识)的所有 friend 将如下所示:

SELECT *
FROM
person
WHERE
id <> :person_id
AND (
id IN (
SELECT friend_id
FROM friendship
WHERE member_id = :person_id
)
OR
id IN (
SELECT member_id
FROM friendship
WHERE friend_id = :person_id
)
)

顺便说一句,在这个方案中,您可能想要重命名 member_idfriend_id比如说,friend1_idfriend2_id ...

关于mysql - 在 mysql 数据库中存储友谊协会的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8903882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com