SQL 中是否有一种方法可以强制执行无向边的唯一性?

问题描述

@override
  Widget build(BuildContext context) {
    User user;
    if(_users != null && _users.length > 0) {
       user = _users[index];
    }
    return Scaffold(
      appBar: AppBar(
        title: Text(_loading ? 'Loading...' : 'Users'),),body: Container(
        color: Colors.white,child: ListView.builder(
          itemCount: user?.clientInfos?.length ?? 0,itemBuilder: (context,index) {
            return ListTile(
              title: Text(user.clientInfos[index].cLINTNAME),subtitle: Text(user.clientInfos[index].cLINTEMAIL),);
          },);
  }

使用此架构,您可以为一对位置创建 2 条不同的旅程,一条用于进路,另一条用于返回。我想要的是为每对位置强制执行一次旅程。有哪些选项可以做到这一点?

解决方法

最简单的方法是强制执行“方向”,然后使用唯一约束:

create table Journey (
    id integer primary key,id_from integer foreign key references Location(id),id_to integer foreign key references Location(id),name varchar(100) unique,unique(id_from,id_to),check (id_from < id_to)
);

但是,您必须记住插入值以使用触发器来确保它们是有序的。

否则,您可以对最小值和最大值使用计算列,然后对其使用唯一约束。

,

您可以使用 sum 和 product 计算列来强制执行无向边的唯一性:

create table Location (
  id integer primary key(1,1),latitude decimal(8,6),longitude decimal(9,address varchar(100),name varchar(60) unique
);
create table Journey (
  id integer primary key identity(1,s as id_from + id_to persisted,p as id_from * id_to persisted,unique(s,p),);

是为每对位置强制执行单次旅程(无论是进入还是返回)的正确方法。二次方程最多有两个解。它至少有 id_from 和 id_to。所以方程 xx - sx + p=0 总是正好有 2 个解,即 id_from 和 id_to。你可以在那里看到数学解释https://math.stackexchange.com/questions/171407/finding-two-numbers-given-their-sum-and-their-product