假设我有两个分别位于单独的Ignite缓存中的表,分别是A
和B
,
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如何在表之间建立亲缘关系。
答案 0 :(得分:2)
点燃实际上并没有建立任何“亲和关系”。它所做的只是将缓存键映射到相似性键。保证所有缓存中具有相同相似性键的所有条目都可以并置。
例如使用以下键进行缓存
class KeyA { int a1; int a2; @AffinityKeyMapped int affKey; }
class KeyB { int b1; int b2; @AffinityKeyMapped int affKey; }
这里我们说KeyA
和KeyB
是通过affKey
并置的-当affKey
的值匹配时,条目将并置。但是实际上Ignite不了解KeyA
和KeyB
之间的联系,它会分别处理表。只有保证亲和力键到节点的映射是一致的,这项工作才能实现。换句话说,这些缓存之间的关系只存在于我们的头脑中,确保正确配置是我们的责任。
最后,根据您的情况。可能令人惊讶,但是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
是缓存键的一部分,而不是值的一部分-否则,它将是忽略。