当前位置: 首页 > 知识库问答 >
问题:

存储交互数据的规范方法sql

丌官昊天
2023-03-14

我有很多相同类的实例。现在这些对象可以被链接并且这个链接可以有一个权重。就像在无向图中一样。现在我想在我的mysql数据库中存储每两个对象之间的关系。

数据如下所示

a ===WEIGHT=== b
a ===WEIGHT=== c
b ===WEIGHT=== a
...

我可以创建一个具有以下结构的表:

object1_id object2_id权重

但是在搜索两个对象之间的权重时,我不知道哪个是object1和哪个是object2。所以我需要写两个查询。此外,如果我想添加权重,并且想首先检查它是否已经在我的数据库中,我必须编写两个查询以确保它不在其中。

这两个问题是:

SELECT weight from tableName where object1_id = $1 AND object2_id = $2;
SELECT weight from tableName where object1_id = $2 AND object2_id = $1;

以确保检查这两种可能性,因为我不知道它是如何存储的。

我想有一个更好的方法来存储这样的数据。可能对于这个问题已经有很多答案了,但是我不知道这个问题是怎么称呼的,所以很难找到解决方案。

谢谢你的建议。

共有1个答案

楚宪
2023-03-14

如果数据中只有一个边沿,那么您可以使用:

select t.*
from t
where (object1_id, object2_id) in ( ($1, $2), ($2, $1) );

如果两条边都可能在表中,并且您任意需要一条边,则添加limit1

如果希望强制数据库中只有一个边缘,则可以对表达式使用唯一索引:

create unique index unq_t_object1_id_object2_id on
    t( least(object1_id, object2_id), greatest(object1_id, object2_id) );

您可能还想添加一个check约束,以便它们始终保持顺序:

alter table t add constraint chk_object1_id_object2_id check (object1_id < object2_id);

在强制执行这些条件后,您可以将上述查询更改为:

select t.*
from t
where object1_id = least($1, $2) and
      object2_id = greatest($1, $2);

这对优化器来说其实更容易优化。

 类似资料:
  • 小数转 2 进制 方法:乘2取整 对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止。第一次所得到为最高位,最后一次得到为最低位。 如0.25的二进制: 0.25*2 = 0.5 取整是0, 0.5*2 =1.0 取整是1, 即0.25的二进制为 0.01(第一

  • 小数转 2 进制 方法:乘2取整 对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止。第一次所得到为最高位,最后一次得到为最低位。 如0.25的二进制: 0.25*2 = 0.5 取整是0, 0.5*2 =1.0 取整是1, 即0.25的二进制为 0.01(第一

  • 1.1.1. 目录 1.1.2. 实现用途 1.1.3. 用户与Rokid技能的互动方式 1.1.4. 从用户那获取信息和提供反馈 1.1.1. 目录 实现用途 用户与Rokid技能的互动方式 完整意图 部分意图 无意图 从用户那获取信息和提供反馈 反馈作用和提示类型 为用户提供反馈选项 提供智能反馈推送 语音反馈应该简洁明了 反馈信息的几点建议 与用户进行确认 处理对话错误 本文档将与您分享如何

  • 本文向大家介绍Ajax与用户交互的JSON数据存储格式,包括了Ajax与用户交互的JSON数据存储格式的使用技巧和注意事项,需要的朋友参考一下 数据存储是JavaScript的核心功能,这是一个在学习前期的一个容易让人迷惑的问题。它并不是那种像页面滑动、幻灯片展示、淡入淡出等吸引人眼球的特效。适当的存放好数据,就有利于我们组织起结构,又能使应用程序稍后访问这些内容更加容易。JavaScript提供

  • 本文向大家介绍android数据存储之文件存储方法,包括了android数据存储之文件存储方法的使用技巧和注意事项,需要的朋友参考一下 文件存储是 Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动的保存到文件当中的。 概述 文件存取的核心就是输入流和输出流。 Android文件的操作模式 文件的相关操作方法 文件读写的实现 openFileOu

  • 表规范 命名统一小写下划线 非CMF核心应用,统一带应用表前缀,如portal_ 插件表,统一带插件表前缀,如:demo_ 表默认编码utf8mb4,默认排序规则utf8mb4_general_ci 引擎统一innodb 写表注释 字段规范 命名统一小写下划线 非自增主键一定要写字段注释 数据类型尽量用数字类型,数字类型的比字符类型的要快很多。 数据类型尽量小,这里的尽量小是指在满足可以预见的未来