2

我正在使用 Cassandra 从 SQL 转到 NoSQL。

我读过你真的需要 SQL 在 Cassandra 中完成所有工作吗?. 这谈到了sql select,join,group by和order by,但是sql数据库中没有关于“id”概念的内容。在 SQL 中,所有值都有一个唯一标识符。

nosql/cassandra 有类似的东西吗?什么?newId = lastId + 1用 Cassandra 做类似或类似的事情是否安全?如何做?

谢谢。

4

2 回答 2

1

Cassandra 中不存在 ID。它是一个简单的键/值存储,您需要为您提供自己的文档 ID(称为键)。建议的方法是使用 UUID,它旨在避免键冲突。

做类似newId = lastId + 1的事情根本不安全。Cassandra 在设计上不支持事务,也无法使读写原子化。并发事务可能会使此失败:

  • 进程 A 读取 10
  • 进程 B 读取 10
  • 进程 A 写入 10 + 1 = 11
  • 进程 B 写入 10 + 1 = 11...哎呀,这应该是 12。

如果您有兴趣,Cassandra Counters会解决这个问题。

于 2012-05-27T08:37:29.447 回答
0

如果您要从 SQL 转到 noSQL,另一个要考虑的选项是 playOrm

它像这样执行 Scalable JQL(注意添加了分区,但除此之外,SQL 是相同的)

@NoSqlQuery(name="findJoinOnNullPartition", query="PARTITIONS p(:partId) select p FROM TABLE as p INNER JOIN p.security as s where s.securityType = :type and p.numShares = :shares"),

此外,它还会为您生成唯一的集群密钥,因此您不必总是处理密钥生成;)。playOrm 的密钥生成示例在这里(在一个集群中是唯一的)...

https://github.com/deanhiller/playorm/blob/master/input/javasrc/com/alvazan/orm/api/base/spi/UniqueKeyGenerator.java

于 2012-09-05T12:22:13.250 回答