Cassandra vs MongoDB——用以前未知的键存储JSON数据



我正在尝试集成一个NoSQL数据库来存储JSON数据,而不是一个SQL数据库来存储JSON数据(存储JSON对象的列)。

对于MongoDB,我可以通过以下操作插入JSON文件:

document = <JSON OBJECT>
collection.insert(document)

然而,对于Cassandra,根据这个网页:http://www.datastax.com/dev/blog/whats-new-in-cassandra-2-2-json-support

不能少于schema,这意味着我需要事先创建一个表:

CREATE TABLE users (
    id text PRIMARY KEY,
    age int,
    state text
);

然后插入数据:

INSERT INTO users JSON '{"id": "user123", "age": 42, "state": "TX"}';

问题是我想尝试使用Cassandra,我刚刚完成了DataStax的教程,但似乎我需要事先知道JSON数据的键,这是不可能的。

或者当有一个新的数据列时,如果有一个未知的键,我应该改变表吗?这听起来不像是一个很好的设计决策。

谁能给我指个正确的方向?由于

这个JSON支持非常容易误导-它是Cql支持的JSON,而不是存储中的JSON。

或者当有一个新的数据列时,我应该修改表吗是未知的钥匙吗?那听起来不像是一个很好的设计决定。

这确实不是一个好的决定——JSON中的字段在不同的实体中可以有不同的类型——一个列名不能满足所有的需求。此外,添加新字段需要在集群中进行模式传播,因此第一次插入(将包含alter table +插入数据)将非常缓慢。

Cassandra没有给你任何内置的机制,但是你可以做的是,把整个JSON放在一个字段中,并在额外的单独列中公开所需的属性。例如:

CREATE TABLE users (
    id text PRIMARY KEY,
    json text, //in json age and state
    age int //explicit duplicated property - if you need e.g. index
);

顺便说一句。我猜Cassandra很久以前就支持你的观点,但现在它更偏向于强类型。

CQL提供了创建和使用用户定义数据类型的功能。您可以创建一个数据类型来处理多个字段。所以你可以简单地用create type CQL命令http://www.tutorialspoint.com/cassandra/cassandra_cql_user_defined_datatypes.htm

最新更新