首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中有没有一种方法来加强无向边的单一性?

在SQL中有没有一种方法来加强无向边的单一性?
EN

Stack Overflow用户
提问于 2021-01-04 00:19:35
回答 2查看 47关注 0票数 1
代码语言:javascript
复制
create table Location (
id integer primary key(1, 1),
latitude decimal(8,6),
longitude decimal(9,6),
address varchar(100),
name varchar(60) unique
);

create table Journey (
id integer primary key(1,1),
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)
);

使用此模式,您可以为一对位置创建两个不同的旅程,一个用于进入,另一个用于返回。我想要的是为每一对位置强制执行一次旅行。要做到这一点,有哪些选择?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-04 00:22:03

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

代码语言:javascript
复制
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)
);

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

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

票数 2
EN

Stack Overflow用户

发布于 2021-01-06 06:17:19

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

代码语言:javascript
复制
create table Location (
  id integer primary key(1, 1),
  latitude decimal(8,6),
  longitude decimal(9,6),
  address varchar(100),
  name varchar(60) unique
);
create table Journey (
  id integer primary key identity(1,1),
  id_from integer foreign key references Location(id),
  id_to integer foreign key references Location(id),
  s as id_from + id_to persisted,
  p as id_from * id_to persisted,
  unique(s, p),
  name varchar(100) unique,
);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65552097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档