点燃具有不同关联键的缓存之间的并置

时间:2018-11-29 20:32:08

标签: scala ignite

假设我有两个分别位于单独的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的{​​{1}}项并置,但是我也希望所有parentId项与引用的{ {1}}条目,我如何在B中不包含parentId字段的情况下建立这种亲缘关系?还是这不可能?

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

1 个答案:

答案 0 :(得分:2)

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是缓存的一部分,而不是值的一部分-否则,它将是忽略。