当前位置: 首页 > 面试题库 >

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

韩单弓
2023-03-14
问题内容

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

1,2,3,4

我想存储以下组合:

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

不需要订购。我当前的实现是要有一个CombinationsObjectIds映射到CombinationIds的表。因此,每个组合都会收到一个唯一的ID:

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

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


问题答案:

问题在于,用于查找特定组合的CombinationId的查询似乎非常复杂。

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

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 NOTISTS,这似乎更容易解释。

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

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个结果导致ingCOUNT(*)后为6行GROUP,而不是4行,因此我们知道这不是我们要遵循的组合。



 类似资料:
  • 我想了解一下这个例子,从AWS映射关系模型到nosql https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-modeling-nosql-B.html 这里强调的一个关键概念是: 重要的 .... 大多数设计良好的应用程序只需要一个表。。。 因此,示例表如下 它解释了, 您可以定义以下实体,这些实体支持关系订单条目

  • 我试图将请求体从邮递员映射到spring boot实体,

  • 流上的操作是否可以生成一个映射,其中值是数组而不是列表或其他集合类型? 例如:我有一个类。事物有所有者,所以有一个方法。在一个事物流中,我想按所有者ID对事物进行分组,以便具有相同所有者ID的事物最终在一个数组中。换句话说,我想要一个像下面这样的映射,其中键是所有者ID,值是属于该所有者的事物数组。 在我的例子中,因为我需要将映射值传递给一个需要数组的库方法,所以收集到一个< code >映射中是

  • 如何在spring数据R2DBC中使用映射,以获取具有接收/发送到数据库的关系的映射表/实体?使用r2dbcCustomConversions、@WritingConverter和@ReadingConverter。有人可以给予。一些实例谢谢

  • 我正在尝试将我的对象[]数组映射并过滤到int[]数组。如果对象是int,效果很好,但如果不是int,则抛出强制转换异常。我想知道我是否可以在lambda表达式中附加一个try/catch?这是我的代码: 或者更好的方法是试着抓住整个街区?

  • 问题内容: 尝试创建组合键(EmbeddedId)时,我遇到了Ebean的问题。 这是我所拥有的草案: 注意 :我正在将Ebean 4.1.4与Java 1.6一起使用。 因此,此代码运行良好,但存在一个我正在尝试解决的问题-数据库中的结果表如下所示: entityB_ID [主要] entityA_FK_ID [主要] 实体A_fk 如您所见,考虑到“ entityA_FK_ID”列,最后一列是