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)
);使用此模式,您可以为一对位置创建两个不同的旅程,一个用于进入,另一个用于返回。我想要的是为每一对位置强制执行一次旅行。要做到这一点,有哪些选择?
发布于 2021-01-04 00:22:03
最简单的方法是强制执行“方向”,然后使用唯一约束:
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)
);但是,您必须记住插入这些值,以便使用触发器来确保它们是有序的。
否则,可以对最小和最大值使用计算列,然后对其使用唯一约束。
发布于 2021-01-06 06:17:19
您可以使用sum和product计算列强制使用无向边的单一性:
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上看到数学解释
https://stackoverflow.com/questions/65552097
复制相似问题