【问题标题】:INSERTing into mysql table for user relationships插入 mysql 表以获取用户关系
【发布时间】:2011-12-27 14:25:55
【问题描述】:

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

如何在 INSERT 之前检查两列?

而且我的问题更加严重,因为我有两个表(请求和关系)。请求表中的一行将在用户批准后被删除并插入到关系中。使用两个表的原因是很多待处理的请求使表很长,应该经常使用它来显示用户朋友。

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

【问题讨论】:

  • 请不要为同一问题打开新主题:stackoverflow.com/questions/8104956/…
  • @wildplasser 这些是不同的话题,一个是关于表结构以及如何插入,一个是如何使用 JOIN 读取表(如果不改变表结构)。

标签: mysql sql relational-database normalization


【解决方案1】:

每当我使用 “链接表” 来跟踪多对多关系时,我总是DELETE之前的所有现有关系>插入新的关系。但是,这可能不适用于您的情况,因为您的链接表包含代理键 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
然后,您可以执行与此视图不同的选择以仅获取唯一的请求集。

【讨论】:

    【解决方案2】:

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

    • 在两个 user_id 列上创建一个 unique composite index

    • INSERT 撤销为relationships 并为INSERT 实现一个存储过程(这可以做任何你想要的检查等)或者实现一个ON BEFORE INSERT trigger 来满足你的需求

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 2016-05-16
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多