我有一些彼此相关的特定数据集。我需要将它们存储在列中。
如何为商店数组或集合创建列族?谢谢!
答案 0 :(得分:1)
如果您使用PlayOrm进行cassandra,您只需
@NoSqlEmbedded
private List<String> stuff;
它适合你。
如果您自己动手,只需将其转换为字节并存储即可。但要小心。有服务器1和服务器2读取值a,b,c和服务器1添加d和服务器2添加e的情况。如果你不做PlayOrm为你做的事情并且两个服务器都回写,你最终得到a,b,c,d或a,b,c,e。使用上面的PlayOrm,当两个服务器都回写时,你最终得到a,b,c,d,e。
如果你想和PlayOrm做同样的事情,那么将每个元素存储在它自己的列中是明智的,所以写入是独立的,不要互相吹嘘,但也许你对它好吗?
编辑:PlayOrm获取a,b,c,d的列表,并将其视为一个集合,因此每个都是唯一的。现在,假设使用PlayOrm的两台服务器进行写操作。
一台服务器写出来 stuff:a = null,stuff:b = null,stuff:c = null
第二台服务器写出来 stuff:a = null,stuff:b = null,stuff:d = null
如果您阅读上述内容,最终会得到a,b,c,d。如果您执行此操作并写入ONE列,则最后一个服务器获胜,但在此策略中,结果将合并。这称为复合列名称,我们将值存储在列名而不是值字段中。
如果您感兴趣,可以获取更多信息.....在PlayOrm中,您可以创建一个类似的实体
@NoSqlEntity
public class Entity {
@NoSqlId
private String id;
@NoSqlEmbedded
private List<String> stuff = new ArrayList<String>();
}
然后你可以像这样保存它
NoSqlEntityManager mgr = ...
mgr.put(someEntity);
mgr.put(otherEntity);
mgr.flush(); //here it is all actually written together
刷新也很好,因为如果你的任何一个代码中都有异常,那么它的写入就会保护你免受nosql商店中数据损坏的影响。
因此,PlayOrm基本上会将您实体的每个实例转换为noSql存储中的一行。您可以在这里查看playorm功能列表
https://github.com/deanhiller/playorm#playorm-feature-list
基本上,它不能真正成为JPA,因为它利用了JPA没有的许多新的noSql模式。
答案 1 :(得分:1)
为什么不为每个列表元素创建一列?
例如,array = [a,b,c,d]
col name col value
---------------------
array:0 | a
array:1 | b
array:2 | c
array:3 | d