我的数据库中包含以下类型的数据,并希望存储到Gemfire中。
+------------------------------+--------------------------------+----------------------------------------+----------------------------------+----------------------------------+------------------------------------+-----------------------------------+------------------------------+------------------------+----------------------------+-------------------------------------+--+
| A | B | C | D | E | F | G | H | I | J | date |
+------------------------------+--------------------------------+----------------------------------------+----------------------------------+----------------------------------+------------------------------------+-----------------------------------+------------------------------+------------------------+----------------------------+-------------------------------------+--+
| VK | XXXXXXXXXXXXXXXX | YYY | VBGFD | 9 | 193.83 | 9 | T | | False | 2017-08-25 |
| VK | XXXXXXXXXXXXXXXX | YYY | VBGFD | 25.22 | 193.83 | 9 | T | | False | 2017-08-25 |
| VK | XXXXXXXXXXXXXXXX | YYY | VBGFD | 9 | 112.23 | 9 | T | | False | 2017-08-25 |
| VK | XXXXXXXXXXXXXXXX | YYY | VBGFD | NULL | 89.98 | NULL | T | | False | 2017-08-25 |
+------------------------------+--------------------------------+----------------------------------------+----------------------------------+----------------------------------+------------------------------------+-----------------------------------+------------------------------+------------------------+----------------------------+-------------------------------------+--+
4 rows selected (2.248 seconds)
1)您可以看到数据是重复的,任何一个具有不同值的列都将被视为唯一行。
2)我不能使用任何列作为Gemfire键,因为它会覆盖值(因为数据是重复的)
我有以下两种可能的解决方案:
方法1
我可以使用复合键(pojo)作为gemfire键,但问题是我需要使用相同的pojo作为键和值(根据数据)
package data;
Class KEY{
private String A;
private String B ;
private String C ;
private String D ;
private String E ;
private String F;
private String G ;
private String H ;
private String I ;
private String J ;
private String date ;
}
package data
Class Value{
private String A;
private String B ;
private String C ;
private String D ;
private String E ;
private String F;
private String G ;
private String H ;
private String I ;
private String J ;
private String date ;
}
put --key=(KEY) --value=(Value) --region=/region1 --key-class=data.KEY --value-class=data.Value
这种方法的问题是,它将使我在区域中的数据大小加倍,并且我的加载器开始抛出内存错误。
方法2
在数据库中创建自动增量id并使用此id作为键但是我需要创建索引,增量id不会是我的sql的一部分。
我的查询
query --query='select a,b,c,d,e,f,g,h,i,j,date from / myRegion where a=VK and b=XXXXXXXXXXXXXXXX and c=YYY and F=193.83'
我很想知道是否有人遇到同样的情况?
更新 我决定使用自动增量id(Long)作为键,使用pojo作为值。 计划在列上创建范围索引。
答案 0 :(得分:1)
您拥有哪种数据访问模式?如果您只是使用OQL或函数来查询数据,我建议生成一个随机密钥,并将值作为您的数据。
我认为保留密钥中的所有数据没有任何价值。如果您要进行查找(使用region.get(key)),则需要所有数据来创建密钥,此时get()将没有任何价值。
(更新)
您的密钥应该具有您在查找时始终可用的最小字段数。由于在您的查询中您使用的是a,b,c和d,我建议您的密钥由a,b,c和d组成,并且您的值包含其余字段。此时你可以只做一个region.get(key),不需要编写查询。