插入mysql表以获取用户关系

时间:2011-11-12 11:43:58

标签: mysql sql relational-database normalization

我有一个用于多对多用户关系的表(三列:relationship_id,user_id,user_id)。当表接受任何条目时,如何保持关系的唯一性?当我有一排 22 11 43 如何阻止对next_id 11 43进行INSERT,更重要的是阻止next_id 43 11?当用户11请求与用户43的关系时,用户43必须不能请求与用户11的关系。

如何在INSERT之前检查两列?

我的问题更严重,因为我有两个表(请求和关系)。来自请求表的行将被删除并在用户批准时插入关系中。使用两个表的原因是许多待处理请求使表格如此长,应该定期用于显示用户朋友。

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

2 个答案:

答案 0 :(得分:2)

无论何时我使用 “链接表” 来跟踪多对多关系,我总是删除 插入新关系。但是,这可能不适用于您的情况,因为您的链接表包含代理键relationship_id。如果从链接表中删除代理键并使用存储过程,则可以执行列出的所有操作。

识别重复项

使用 CASE 逻辑创建查看
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
然后,您可以选择与此视图不同的选项,以仅获取唯一的请求集。

答案 1 :(得分:1)

以下是一些实现您想要的选项(选择或组合的选项主要取决于您的数据模型,客户端架构和存储引擎):

  • user_id列上创建unique composite index

  • INSERT撤销到relationships并为INSERT实施存储过程(这可以执行您想要的任何检查等)或实现ON BEFORE INSERT trigger你想要什么

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

  • idcomb中使用relationshipsUNIQUE INDEX创建第四列ON BEFORE INSERT TRIGGER,只需要user_id对它们进行排序并将它们连接起来一个- inbetween并将其作为值分配给idcomb列...这样所有工作都由索引完成,客户端不需要更改(当插入一些重复时返回错误)