Scala 点燃具有不同亲和键的缓存之间的搭配
假设我在独立的Ignite缓存中有两个表,Scala 点燃具有不同亲和键的缓存之间的搭配,scala,ignite,Scala,Ignite,假设我在独立的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
和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
条目都具有相同的parentId
,但我也希望所有B
条目都与引用的A
条目的parentId
并置,那么在B
中不包含parentId
字段的情况下,我如何设置此关联关系?或者这是不可能的
从Ignite的文档中,我不清楚Ignite如何在表之间建立关联关系。Ignite如何管理关联配置
Ignite并没有真正建立任何“亲和力关系”。它所做的只是将缓存键映射到关联键。所有缓存中具有相同相似性密钥的所有条目都保证并置
例如,使用以下键获取缓存
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并不是亲和力密钥的理想候选项。假设我们有三个值
{ 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 }
不幸的是,第二个缓存必须引用与affinity key完全相同的值,如果不将其作为字段添加,则无法执行此操作
{ aId: 2, aGroupId: 1 }
此外,尽管它与问题没有直接关系,但请确保@AffinityKeyMapped
是缓存键的一部分,而不是值的一部分-否则,它将被忽略。Ignite如何管理亲和性搭配
Ignite并没有真正建立任何“亲和力关系”。它所做的只是将缓存键映射到关联键。所有缓存中具有相同相似性密钥的所有条目都保证并置
例如,使用以下键获取缓存
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并不是亲和力密钥的理想候选项。假设我们有三个值
{ 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 }
不幸的是,第二个缓存必须引用与affinity key完全相同的值,如果不将其作为字段添加,则无法执行此操作
{ aId: 2, aGroupId: 1 }
此外,尽管它与问题没有直接关系,但请确保
@AffinityKeyMapped
是缓存键的一部分,而不是值的一部分-否则,它将被忽略。命名约定是否重要,或者仅仅是“任何缓存中具有值x的任何关联键都保证位于同一节点上”?命名不重要,只有值。亲和键的值映射到分区号,分区映射到节点。映射代码(实际上,这是在CacheConfiguration.affinity
中设置的函数)不知道名称、缓存等,并且通常对所有类和键都是相同的。那么命名约定是否有任何意义,或者只是“任何缓存中具有值x的任何affinity键都保证位于同一节点上”?命名并不重要,只有值。亲和键的值映射到分区号,分区映射到节点。映射代码(实际上,这是在CacheConfiguration.affinity
中设置的函数)不知道名称、缓存等,通常对所有类和键都是相同的。