我有很多相同类的实例。现在这些对象可以被链接并且这个链接可以有一个权重。就像在无向图中一样。现在我想在我的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;
以确保检查这两种可能性,因为我不知道它是如何存储的。
我想有一个更好的方法来存储这样的数据。可能对于这个问题已经有很多答案了,但是我不知道这个问题是怎么称呼的,所以很难找到解决方案。
谢谢你的建议。
如果数据中只有一个边沿,那么您可以使用:
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 写表注释 字段规范 命名统一小写下划线 非自增主键一定要写字段注释 数据类型尽量用数字类型,数字类型的比字符类型的要快很多。 数据类型尽量小,这里的尽量小是指在满足可以预见的未来