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

Mysql sql中存储交互数据的规范方法,mysql,sql,relational-database,Mysql,Sql,Relational Database,我有很多同一类的实例。现在可以链接这些对象,并且此链接可以具有权重。就像在无向图中一样。现在我想在mysql数据库中存储每两个对象之间的关系 数据如下所示 a ===WEIGHT=== b a ===WEIGHT=== c b ===WEIGHT=== a ... 我可以创建一个具有以下结构的表: 对象1|id |对象2|id |重量 但在搜索两个对象之间的权重时,我不知道哪一个是object1,哪一个是object2。所以我需要写两个查询。另外,如果我想添加权重并想首先检查它是否已经在我的数

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

数据如下所示

a ===WEIGHT=== b
a ===WEIGHT=== c
b ===WEIGHT=== a
...
我可以创建一个具有以下结构的表:

对象1|id |对象2|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) );
如果两条边都在表中,并且您任意想要一条,则添加限制1

如果要强制数据库中只有一条边,可以对表达式使用唯一索引:

create unique index unq_t_object1_id_object2_id on
    t( (least(object1_id, object2_id)), (greatest(object1_id, object2_id)) );
您可能还希望添加一个检查约束,以便它们始终处于有序状态:

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

这实际上更便于优化器进行优化。

如果您向我们展示这两个您认为需要添加的查询,可能会帮助我们理解您的问题question@RiggsFolly我根据你的评论编辑了我的答案。哇,谢谢你的详细回答。这似乎是解决我问题的好办法!尝试创建唯一索引时。我收到此错误消息:object1\u id在此位置无效,应为。这至少显示在对象1_id位置。@progNewbie。毫无疑问,出于非常有趣的原因,MySQL在创建基于函数的索引时需要在非列表达式周围加上括号。我倾向于忘记这一点,因为其他数据库没有这种特性。我把它们加入了答案中。
select t.*
from t
where object1_id = least($1, $2) and
      object2_id = greatest($1, $2);