我有一些相互关联的特定数据集。我需要将它们存储在列中。
如何为存储数组或集合创建列族?谢谢!
如果您将 PlayOrm 用于 cassandra,您只需
@NoSqlEmbedded
private List<String> stuff;
它为你做到了。
如果您自己做,只需将其转换为字节并存储即可。不过要小心。在某些情况下,服务器 1 和服务器 2 读取值 a、b、c 并且服务器 1 添加 d 并且服务器 2 添加 e。如果你不做 PlayOrm 为你做的事情并且两个服务器都回写,你最终会得到 a,b,c,d OR a,b,c,e。使用 PlayOrm 中的上述内容,当两个服务器都回写时,您最终会得到 a,b,c,d,e。
如果你想和 PlayOrm 做同样的事情,最好将每个元素存储在它自己的列中,这样写入是独立的,不会互相影响,但也许你可以接受?
编辑:PlayOrm 采用 a、b、c、d 的 List 并将其视为 Set,因此每个都是独一无二的。现在,假设两台服务器使用 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 模式。
为什么不为每个列表元素创建一列?
例如数组 = [a, b, c, d]
col name col value
---------------------
array:0 | a
array:1 | b
array:2 | c
array:3 | d