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);