SQL 设计并查询 Table 用于存储组合
SQL Design and Query a Table for storing Combinations
我想存储两个字段的组合(不是排列 - 顺序无关紧要)。例如,假设我有两个整数字段:A 和 B。我想存储组合 (1, 2)。意思是如果我查找“1”,我应该看到 [2],如果我查找“2”,我应该看到 [1]。
我的第一个猜测是创建一个 table 如下:
CREATE TABLE RelatedIntegers (
A INT,
B INT,
PRIMARY KEY(A, B)
);
INSERT INTO RelatedIntegers VALUES (1, 2)
但是,完全有可能存储 (2, 1) 这将是一个重复组合,而不是排列。此外,如果我只存储 (1, 2),这意味着我必须对 A 和 B 执行更复杂的查询以确保我获得所有必要的信息。
我看到的唯一方法是我需要存储每个排列,以便我可以对 A 执行快速查找,并让 B 包含我需要的任何值。然而,这也意味着我必须存储冗余信息以确保数据完整性。如果我需要存储冗余信息,推荐的方法是什么以确保存储所有组合(并轻松删除)?我在考虑确保使用数据库的应用程序在插入时生成必要的排列。我的另一个想法是在每个 insert/delete 上使用数据库触发器,但我想这可能更令人困惑。
您可以使用检查约束强制对中的值排序。
CREATE TABLE relatedintegers
(a integer,
b integer,
PRIMARY KEY (a,
b),
CHECK (a < b));
这样(1, 2)
可以插入,但是(2, 1)
不能。 (将 <
更改为 <=
,如果像 (1, 1)
这样的对也可以。或者切换到 >
(或 >=
),如果这对您来说更有意义例。)
并且在查询中获取在任何位置包含值 <n>
的所有记录,您可以使用 IN
.
SELECT *
FROM relatedintegers
WHERE <n> IN (a,
b);
我想存储两个字段的组合(不是排列 - 顺序无关紧要)。例如,假设我有两个整数字段:A 和 B。我想存储组合 (1, 2)。意思是如果我查找“1”,我应该看到 [2],如果我查找“2”,我应该看到 [1]。
我的第一个猜测是创建一个 table 如下:
CREATE TABLE RelatedIntegers (
A INT,
B INT,
PRIMARY KEY(A, B)
);
INSERT INTO RelatedIntegers VALUES (1, 2)
但是,完全有可能存储 (2, 1) 这将是一个重复组合,而不是排列。此外,如果我只存储 (1, 2),这意味着我必须对 A 和 B 执行更复杂的查询以确保我获得所有必要的信息。
我看到的唯一方法是我需要存储每个排列,以便我可以对 A 执行快速查找,并让 B 包含我需要的任何值。然而,这也意味着我必须存储冗余信息以确保数据完整性。如果我需要存储冗余信息,推荐的方法是什么以确保存储所有组合(并轻松删除)?我在考虑确保使用数据库的应用程序在插入时生成必要的排列。我的另一个想法是在每个 insert/delete 上使用数据库触发器,但我想这可能更令人困惑。
您可以使用检查约束强制对中的值排序。
CREATE TABLE relatedintegers
(a integer,
b integer,
PRIMARY KEY (a,
b),
CHECK (a < b));
这样(1, 2)
可以插入,但是(2, 1)
不能。 (将 <
更改为 <=
,如果像 (1, 1)
这样的对也可以。或者切换到 >
(或 >=
),如果这对您来说更有意义例。)
并且在查询中获取在任何位置包含值 <n>
的所有记录,您可以使用 IN
.
SELECT *
FROM relatedintegers
WHERE <n> IN (a,
b);