【问题标题】:SQL Design and Query a Table for storing CombinationsSQL 设计和查询用于存储组合的表
【发布时间】:2021-04-25 20:54:40
【问题描述】:

我正在寻找存储两个字段的组合(不是排列 - 顺序无关紧要)。例如,假设我有两个整数字段:A 和 B。我想存储组合 (1, 2)。这意味着如果我查找“1”,我应该看到 [2],如果我查找“2”,我应该看到 [1]。

我的第一个猜测是创建一个表如下:

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 包含我需要的任何值。但是,这也意味着我必须存储冗余信息以确保数据完整性。如果我需要存储冗余信息,建议使用什么方法来确保存储所有组合(并轻松删除)?我在考虑确保使用数据库的应用程序在插入时生成必要的排列。我的另一个想法是在每次插入/删除时使用数据库触发器,但我想这可能会更令人困惑。

【问题讨论】:

  • 您是在询问如何查找和删除现有的重复排列或防止添加重复项
  • 如何防止重复添加,如何高效查询表。如果不可能,那么最有效的方法是什么?

标签: sql combinations permutation


【解决方案1】:

您可以使用检查约束来强制对中的值进行排序。

CREATE TABLE relatedintegers
             (a integer,
              b integer,
              PRIMARY KEY (a,
                           b),
             CHECK (a < b));

这样(1, 2) 可以插入,但(2, 1) 不能。 (将&lt; 更改为&lt;=,如果(1, 1) 之类的配对也可以。或者切换到&gt;(或&gt;=),如果这对您的情况更有意义。)

并且在查询中获取该对在任何位置包含值&lt;n&gt; 的所有记录,您可以使用IN

SELECT *
       FROM relatedintegers
       WHERE <n> IN (a,
                     b);

【讨论】:

  • 我相信这可以解决我的问题。我认为这个技巧不适用于存储基于非整数的信息(例如 GUID),但它确实有效。然而,虽然它有效,但它可能会令人困惑,因为应用程序必须确保 (a WHERE <n> in (a, b) 时,与存储每个排列相比是否会影响性能,并且只检查列a
  • @GLJ:“与存储每个排列并仅检查列 a 相比,性能是否会受到影响”——也许...这取决于您使用的 DBMS实际使用的数据量和确切的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 2013-01-30
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
相关资源
最近更新 更多