首页 > 解决方案 > 点燃具有不同亲和键的缓存之间的搭配

问题描述

假设我在单独的 Ignite 缓存中有两个表,AB使用各自的键:

case class AKey(
    @(QuerySqlField@field) id: Long,
    @(AffinityKeyMapped@field)
    @(QuerySqlField@field) parentId: Long
)

case class BKey(
    @(AffinityKeyMapped@field)
    @(QuerySqlField@field) aId: Long
)

哪里A.parentId是对表中另一个条目的自我引用,A并且B.aId是对A.id.

如果我希望将所有A具有相同的条目并parentId置,但我也希望将所有B条目与parentId引用条目的 并置,我将如何在不包含字段的A情况下设置这种亲和关系?或者这是不可能的?parentIdB

从 Ignite 的文档中我不清楚 Ignite 如何在表之间建立关联关系。

标签: scalaignite

解决方案


Ignite 如何管理亲和力搭配

Ignite 并没有真正建立任何“亲和关系”。它所做的只是将缓存键映射到亲和键。保证所有缓存中具有相同亲和键的所有条目被并置。

例如,使用以下键获取缓存

class KeyA { int a1; int a2; @AffinityKeyMapped int affKey; }
class KeyB { int b1; int b2; @AffinityKeyMapped int affKey; }

在这里,我们说KeyAKeyB通过affKey- 当值affKey匹配时,条目将被并置。但实际上 Ignite 不知道 和 之间的连接KeyAKeyB它单独处理表。只有保证关联键到节点的映射是一致的才能使这项工作有效。换句话说,这些缓存之间的关系只存在于我们的脑海中,确保搭配正确是我们的责任。

解决方案

最后,关于你的情况。这可能令人惊讶,但 parentId 并不是亲和键的理想选择。假设我们在 A 中有三个值

{ id: 1, parentId: 0 }
{ id: 2, parentId: 1 }
{ id: 3, parentId: 2 }

在这里,人们可以期望所有值都被并置,因为它们都在同一个“链”中相互引用。但这是 Ignite 不知道的关系。它所知道的是存在三个不同的parentId值——因此,三个不同的关联键并且没有搭配。

要正确处理这一点,必须提供一些groupdId保证在所有值中都相同的值。在您的情况下,自然适合的是“树”中根元素的 ID。然后groupdId将是@AffinityKeyMapped

{ id: 1, parentId: 0, groupId: 1 }
{ id: 2, parentId: 1, groupId: 1 }
{ id: 3, parentId: 2, groupId: 1 }

不幸的是,第二个缓存必须引用完全相同的关联键值,如果不将其添加为字段,就无法做到这一点。

{ aId: 2, aGroupId: 1 }

此外,虽然它与问题没有直接关系,但请确保它@AffinityKeyMapped是缓存的一部分,而不是值的一部分 - 否则,它将被忽略。


推荐阅读