0

我有一些相互关联的特定数据集。我需要将它们存储在列中。

如何为存储数组或集合创建列族?谢谢!

4

2 回答 2

1

如果您将 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 模式。

于 2012-11-10T20:49:31.983 回答
1

为什么不为每个列表元素创建一列?

例如数组 = [a, b, c, d]

col name   col value
---------------------
array:0  | a
array:1  | b
array:2  | c
array:3  | d
于 2012-11-11T01:47:04.030 回答