同一张表上的多对多

2024-05-07

有趣的是我从来没有遇到过这个!

我从来没有想过一个人可以在一张桌子上建立“多对多”关系,直到我开始开发一种用户可以互相“加好友”的系统(社交网络)。

标准查找表,至少以我习惯使用的方式,在这里不合适。让我们保持简单:

用户表有“id”和“name”列。

User_relationship 表有“uid1”和“uid2”,代表用户是“朋友”或“好友”或“伙伴”或“其他”。

很快就可以看出这里的问题是什么 - uid1 和 uid2 是来自同一个表的同一列的相同数据类型,这意味着唯一键存在缺陷。

例如。: uid1 = 1 uid2 = 2

是相同的:

uid1 = 2 uid2 = 1

因此,如果查询执行错误,可能会返回 2 条记录,或者返回 0 条记录。

本着精心设计表格的精神,我不想扫描整个表格两次来检查现有值。

有什么技巧可以处理这个问题吗?这是一个我从未想到过的设计问题,它让我烦恼,因为我知道有一些简单的技巧可以让它发挥作用。

在你问之前,我还没有尝试过任何东西,因为我已经看到我最喜欢的关联事物的方式(查找表)不足以满足我的需求,我需要一些帮助 - 我在SO或Google上找不到任何东西:(

提前致谢。


如果您描述的关系是对称的,例如“Bob 是 Joe 的朋友”意味着“Joe 也是 Bob 的朋友”,那么您可以在代码中确保 2 个用户 ID 中较小的一个出现在第一列,较大的放在第二列。此约束几乎可以确保查找表中的记录是唯一的。这也意味着当您执行查找时,通常必须搜索两列。

例如,如果您尝试获取 Bob 的所有朋友,则必须查询任一列中包含 Bob ID 的记录。这会导致代码增多,并可能影响性能。

如果关系可以是不对称的,如“Bob 是 Joe 的朋友”并不一定意味着“Joe 也是 Bob 的朋友”,那么每对用户需要 2 个条目:Bob - Joe 和 Joe - Bob。这意味着您的查找表将包含两倍的条目,并且您的网站对跟踪者非常友好:D 当然,即使您的关系是对称的,您仍然可以选择应用此系统。

使用此方法,如果您想获取 Bob 的所有朋友,您只需在第一列中选​​择具有 Bob ID 的记录即可。这可能意味着更快的查找和更少的代码需要编写,但同样,这意味着您在数据库中占用更多空间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同一张表上的多对多 的相关文章

  • 维护/更新mysql中的记录顺序

    我在 mySql 中有一个记录表 我需要按照用户指定的方式维护它们的订单 所以我添加了一个 位置 列 当我移动特定记录时更新所有记录的 SQL 语句是什么 我有类似的东西 UPDATE items SET position 2 WHERE
  • Magento --“SQLSTATE[23000]:违反完整性约束..”客户更新

    迁移服务器后 每次尝试更新客户信息时都会出现错误 我正在使用一个客户激活插件 http www magentocommerce com magento connect vinai extension 489 customer activat
  • 是否可以将新表和旧表从触发器传递到 MySQL 中的过程中?

    是否可以将新表和旧表从触发器传递到 MySQL 中的过程中 我怀疑不会 因为没有过程接受的表这样的数据类型 有什么可能的解决方法吗 理想情况下它看起来像这样 CREATE TRIGGER Product log AFTER UPDATE O
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 如何将 MySQL 查询输出保存到 Excel 或 .txt 文件? [复制]

    这个问题在这里已经有答案了 如何将 MySQL 查询的输出保存到 MS Excel 工作表 即使只能将数据存储在 txt文件 就可以了 From 将 MySQL 查询结果保存到文本或 CSV 文件中 http www tech recipe
  • oursql 中的参数化查询

    如果有人能告诉我是否可以使用命名占位符进行参数化查询 我将不胜感激oursql 一个用于与 MySQL 数据库交互的 python 模块 例如 我尝试了一种可以与 sqlite3 一起使用的查询 c execute select from
  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • MySQL 左连接 WHERE table2.field = "X"

    我有以下表格 pages Field Type Null Key Default Extra page id int 11 NO PRI NULL auto increment type varchar 20 NO NULL
  • 如何在查询语句之外从mysql查询中获取值?

    这是下面的函数console log function quo value value connection query SELECT role from roles where id 1 function error results fi
  • 连接到 OpenShift (Redhat Paas) mysql 实例

    我正在尝试将我的 C 应用程序与 openshift 数据库连接 但我得到了这个例外conn Open Eccezione gt MySql Data MySqlClient MySqlException 0x80004005 Unable
  • MySql 视图脚本中的注释

    可以这样做吗 我尝试过多个 gui mysql workbench navicat toad for mysql 但没有一个保存这样的注释 something important select something else importan
  • “修改列”与“更改列”

    我知道 我们不能使用重命名列MODIFY COLUMN语法 但我们可以使用CHANGE COLUMN syntax 我的问题是 主要用途是什么modify syntax 例如 ALATER TABLE tablename CHANGE co
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 无法连接到 MAMP 上的 phpMyAdmin

    我收到此错误消息 MySQL 说道 无法连接 设置无效 phpMyAdmin 尝试连接 MySQL 服务器 但服务器拒绝连接 您应该检查配置中的主机 用户名和密码 并确保它们与 MySQL 服务器管理员提供的信息相对应 用户和通行证是默认的

随机推荐