为用户关系插入mysql表

为用户关系插入mysql表,mysql,sql,relational-database,normalization,Mysql,Sql,Relational Database,Normalization,我有一个用于多对多用户关系的表(三列:relationship\u id、user\u id、user\u id)。当表接受任何条目时,如何保持关系的唯一性?当我有一排 221143 如何防止插入下一个id11 43,更重要的是插入下一个id43 11?当用户11请求与用户43的关系时,用户43必须不能请求与用户11的关系 如何在插入前检查两列 我的问题甚至更严重,因为我有两个表(请求和关系)。用户批准后,请求表中的一行将被删除并插入到关系中。使用两个表的原因是,许多挂起的请求使该表太长,应该定

我有一个用于多对多用户关系的表(三列:relationship\u id、user\u id、user\u id)。当表接受任何条目时,如何保持关系的唯一性?当我有一排
221143
如何防止插入下一个id
11 43
,更重要的是插入下一个id
43 11
?当用户11请求与用户43的关系时,用户43必须不能请求与用户11的关系

如何在插入前检查两列

我的问题甚至更严重,因为我有两个表(请求和关系)。用户批准后,请求表中的一行将被删除并插入到关系中。使用两个表的原因是,许多挂起的请求使该表太长,应该定期使用该表来显示用户朋友


当从用户11向用户43插入请求时,检查表中是否存在
11 43
43 11
行的最快有效方法是什么:请求和关系?

以下是一些实现所需的选项(选择或组合哪个主要取决于您的数据模型、客户端体系结构和存储引擎):

  • 在两个
    user\u id
    列上创建一个

  • 撤销
    INSERT
    relationships
    中,并为
    INSERT
    实现存储过程(这可以执行您想要的任何检查等),或者实现一个执行您想要的操作的存储过程

  • 如果
    用户id
    s的顺序不相关,请更改
    插入
    代码,以便在
    插入
    ing之前始终对这两个
    id
    s进行排序(例如通过存储过程方法)
    这样,您不需要进行明确的检查,但索引将为您完成所有工作

  • 关系中创建第四列
    idcomb
    ,在插入触发器之前使用
    唯一索引和
    打开
    ,该触发器只需将
    用户id
    进行排序,并将它们与
    -
    中间连接,并将其作为值分配给
    idcomb
    列……这样所有工作都完成了通过索引,不需要在客户端进行任何更改(当插入一些副本时,只是返回一个错误)


以下是一些实现您所需的选项(选择或组合哪些选项主要取决于您的数据模型、客户端体系结构和存储引擎):

  • 在两个
    user\u id
    列上创建一个

  • 撤销
    INSERT
    relationships
    中,并为
    INSERT
    实现存储过程(这可以执行您想要的任何检查等),或者实现一个执行您想要的操作的存储过程

  • 如果
    用户id
    s的顺序不相关,请更改
    插入
    代码,以便在
    插入
    ing之前始终对这两个
    id
    s进行排序(例如通过存储过程方法)
    这样,您不需要进行明确的检查,但索引将为您完成所有工作

  • 关系中创建第四列
    idcomb
    ,在插入触发器之前使用
    唯一索引和
    打开
    ,该触发器只需将
    用户id
    进行排序,并将它们与
    -
    中间连接,并将其作为值分配给
    idcomb
    列……这样所有工作都完成了通过索引,不需要在客户端进行任何更改(当插入一些副本时,只是返回一个错误)


只要我使用了“链接表”为了跟踪多对多关系,我总是在插入新关系之前删除任何现有关系。但是,这在您的情况下可能不起作用,因为您的链接表包含代理键关系id。如果从链接表中删除代理键并使用stor你可以做你列出的每一件事

识别重复项使用案例逻辑创建视图

创建视图vFriendRequests
作为
挑选
案例
当ID_1

然后,您可以执行与此视图不同的选择,以仅获取唯一的请求集。

只要我使用了链接表为了跟踪多对多关系,我总是在插入新关系之前删除任何现有关系。但是,这在您的情况下可能不起作用,因为您的链接表包含代理键关系id。如果从链接表中删除代理键并使用stor你可以做你列出的每一件事

识别重复项使用案例逻辑创建视图

创建视图vFriendRequests
作为
挑选
案例
当ID_1

然后,您可以执行与此视图不同的选择,以仅获取唯一的请求集。

请不要为同一问题打开新主题:@wildplasser这些是不同的主题,一个是关于表结构和如何插入,另一个是如何使用JOIN读取表(如果不更改表结构)。请不要为同一问题打开新主题:@wildplasser这些是不同的主题,一个是关于表结构和如何插入,另一个是如何使用JOIN读取表(如果不更改表结构)。 CREATE VIEW vFriendRequests AS SELECT CASE WHEN ID_1 < ID_2 THEN ID_1 ELSE ID_2 END CASE as RequestId_1, CASE WHEN ID_1 < ID_2 THEN ID_2 ELSE ID_1 END CASE as RequestId_2 FROM Friend_Requests_Table