gpt4 book ai didi

sql - 如何将事物的组合映射到关系数据库?

转载 作者:行者123 更新时间:2023-12-02 22:52:36 25 4
gpt4 key购买 nike

我有一个表,其记录代表某些对象。为了简单起见,我假设该表只有一列,即唯一的 ObjectId。现在我需要一种方法来存储该表中的对象组合。组合必须是唯一的,但可以是任意长度。例如,如果我有 ObjectIds

1,2,3,4

我想存储以下组合:

{1,2}, {1,3,4}, {2,4}, {1,2,3,4}

无需订购。我当前的实现是有一个将 ObjectId 映射到 CombinationId 的表 Combinations。因此每个组合都会收到一个唯一的 ID:

ObjectId | CombinationId
------------------------
1 | 1
2 | 1
1 | 2
3 | 2
4 | 2

这是上面示例的前两个组合的映射。问题是,查找特定组合的 CombinationId 的查询似乎非常复杂。该表的两个主要使用场景是迭代所有组合,以及检索特定组合。该表将被创建一次并且永远不会更新。我正在使用SQLite通过 JDBC。有没有更简单的方法或最佳实践来实现这种映射?

最佳答案

The problem is, that the query for finding the CombinationId of a specific Combination seems to be very complex.

应该不会太糟糕。如果您想要包含所选项目的所有组合(允许添加其他项目),则类似于:

SELECT combinationID
FROM Combination
WHERE objectId IN (1, 3, 4)
GROUP BY combinationID
HAVING COUNT(*) = 3 -- The number of items in the combination

如果您只需要特定的组合(不允许额外的项目),它可以更像:

SELECT combinationID FROM (
-- ... query from above goes here, this gives us all with those 3
) AS candidates

-- This bit gives us a row for each item in the candidates, including
-- the items we know about but also any 'extras'
INNER JOIN combination ON (candidates.combinationID = combination.combinationID)

GROUP BY candidates.combinationID
HAVING COUNT(*) = 3 -- Because we joined back on ALL, ones with extras will have > 3

您还可以在此处(或在原始查询中)使用 NOT EXISTS,这似乎更容易解释。

最后,您也可以有一个简单的查询

SELECT combinationID
FROM Combination AS candidates
INNER JOIN Combination AS allItems ON
(candidates.combinationID = allItems.combinationID)
WHERE candidates.objectId IN (1, 3, 4)
GROUP BY combinationID
HAVING COUNT(*) = 9 -- The number of items in the combination, squared

换句话说,如果我们要查找 {1, 2},并且存在与 {1, 2, 3} 的组合,我们将得到一个 {candidates, allItems} JOIN 结果:

{1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2}, {2, 3}

额外的 3 导致 COUNT(*)GROUP 后为 6 行,而不是 4,所以我们知道这不是我们想要的组合。

关于sql - 如何将事物的组合映射到关系数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2864890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com