我正在学习cassandra以了解如何建模数据以便最好地管理这样的json:
{
"summary": {
"elem": [
{
"score": 15.8,
"value": "xxx"
},
{
"score": 15.7,
"value": "yyy"
},
{
"score": 13.9,
"value": "zzz"
}
],
"sens": [
{
"score": 23,
"start": 0,
"end": 210,
"value": "kkk"
},
{
"score": 12.1,
"start": 212,
"end": 326,
"value": "nnn"
}
]
},
"cats": [
{
"name": "c1",
"val": 10245,
"sens": [
{
"val": "mmm",
"els": [
{
"start": 25,
"end": 38,
"value": "ccc"
}
],
"score": 810,
"start": 0,
"end": 210
},
...
]
},
...
],
"ecv": {
"ens": [
{
"val": "bbb",
"text": "jjj",
"matches": [
{
"start": 2706,
"end": 2719,
"value": "aaa"
}
],
"properties": [
{
"name": "id",
"value": "0001"
},
{
"name": "uni",
"value": "V"
},
...
]
},
...
],
"rels": [
{
"ens": [
{
"text": "pp",
"start": 0,
"end": 7,
"value": "uuu"
},
{
"type": "rrr",
"start": 25,
"end": 38,
"value": "www"
}
],
"act": {
"name": "rtr",
"type": "fff",
"start": 122,
"end": 125
},
"sens": {
"value": "ddd"
}
},
...
]
},
"doms": [
{
"value": "yyy",
"fas": [
{
"val": "ccw",
"sens": {
"start": 0,
"end": 210,
"value": "xxx"
},
"els": [
{
"start": 169,
"end": 178,
"value": "bhh"
},
...
],
"ents": [
{
"val": "ents1",
"type": "xxx",
"matches": [
{
"start": 0,
"end": 7,
"value": "bbb"
}
]
},
...
]
},
...
]
},
...
]
}
我使用了几个月的MongoDB,所以我认为将整个文档写入mongoDB集合很简单。
我无法知道如何设计我的cassandra模型以存储json。
有人可以给我一个开始的方式吗?想想在Cassandra" ?
谢谢!
答案 0 :(得分:2)
理解的重要一点是Cassandra中没有“一个存储”模型。您有一个传统的ER模型,您可以从中导出逻辑模型,并结合约束和性能要求来获得最终的物理模型。你在cassandra中的表是最后一种形式,其他形式是“在你的头脑中”或记录在案 - 想法而不是表格。那么,你怎么去那些桌子?你考虑的是你的疑问。您的表符合您的查询,因此在不知道访问模式的情况下,没有办法说明您应该如何存储它。
Cassandra中的数据存储在分区中。分区由主键中的第一个键标识。分区中的所有行一起存储在一台计算机(和副本)上。如果您的查询命中分区,则速度很快。如果它遇到多个分区(查询中的pk),则速度较慢。如果它击中所有分区,它是最慢的。但是,如果所有查询都遇到一个分区,则会出现热点(某些服务器使用很多,而其他服务器则处于空闲状态)。这在大型集群中可能很糟糕。
在分区内,数据按照聚类键(主键中的“其他”键)按顺序排序。如果已指定所有先前的群集密钥,则只能对群集密钥执行过滤(where)查询。此外,您只能对谓词中的最后一个群集键进行范围查询(>,< etc.)。您还可以创建辅助索引,这可以让您查询群集密钥要求之外的相等条件,尽管它们较慢并且更新为异步。
那里有很多复杂的问题,你可以执行的查询受到更多限制(如果考虑任何类型的性能)。因此,“cassandra方式”是考虑您的查询模式,然后根据这些模式存储数据。如果您有多个存储模式,请以不同的形式复制相同的信息。存储数据没有“一种真实的方式”。