Database Cassandra嵌套键值。更好的解决方案?

Database Cassandra嵌套键值。更好的解决方案?,database,cassandra,nosql,cql3,Database,Cassandra,Nosql,Cql3,我正在尝试在cassandra数据库中创建嵌套数据模型,类似于: Forums = { forum001: { name: "General News", topics: { topic000001: { subject: "This is what I think", date: "2012-08-24 10:12:13", posts

我正在尝试在cassandra数据库中创建嵌套数据模型,类似于:

Forums = {
    forum001: {
        name: "General News",
        topics: {
            topic000001: {
                subject: "This is what I think",
                date: "2012-08-24 10:12:13",
                posts: {
                    post20120824.101213: { username: "tom", content: "Blah blah", datetime: "2012-08-24 10:12:13" }
                    post20120824.101513: { username: "dick", content: "Blah blah blah", datetime: "2012-08-24 10:15:13" }
                    post20120824.103213: { username: "harry", content: "Blah blah", datetime: "2012-08-24 10:32:13" }
                }
            },
            topic000002: {
                subject: "OMG Look at this",
                date: "2012-08-24 10:42:13",
                posts: {
                    post20120824.104213: { username: "tom", content: "Blah blah", datetime: "2012-08-24 10:42:13" }
                    post20120824.104523: { username: "dick", content: "Blah blah blah", datetime: "2012-08-24 10:45:23" }
                    post20120824.104821: { username: "harry", content: "Blah blah", datetime: "2012-08-24 10:48:21" }
                }
            }
        }
    },
    forum002: {
        name: "Specific News",
        topics: {
            topic000003: {
                subject: "Whinge whine",
                date: "2012-08-24 10:12:13",
                posts: {
                    post20120824.101213: { username: "tom", content: "Blah blah", datetime: "2012-08-24 10:12:13" }
                    post20120824.101513: { username: "dick", content: "Blah blah blah", datetime: "2012-08-24 10:15:13" }
                }
            }
        }
    }
}
数据的基本设计是一组相互嵌套的映射。
我已经读到这是不合理的,因为很难查询这个数据结构。为了以这种方式构造数据,有什么更好的解决方案

如果您想使用一系列可以排序的内容(例如示例中的日期)进行查询,那么它需要位于列名称中

首先,我将forums ID设为行键,列_族将如下所示:

*Row*: "forum001"<br>
=> *column*: "name" - *value*: "General News"<br>
=> *column*: "post::20120824101213::[some_uuid]" - *value*: "[serialized blob of data representing everything in the post]"<br>
*行*:“forum001”
=>*列*:“名称”-*值*:“一般新闻”
=>*列*:“post::20120824101213::[some_uuid]”-*值*:“[表示post中所有内容的序列化数据块]”
因此,您必须要求返回范围
post::201203*~post::201204*
中的列,例如3月份的所有帖子

需要记住的是,行是在cassandra集群中随机存储的(如果您保留建议的cassandra的默认设置)。同一行的列位于同一节点上,并且已排序,因此可以将这些列用于值的范围

对于列名,我喜欢使用列中序列化的对象的类型作为前缀(这样我可以在同一行中有许多类型)。然后,您可以选择如何在列名中表示日期:

  • ISO格式日期+随机UUID
    :ISO格式为调试提供可读性,并作为字符串进行排序,附加的UUID用于确保列名的唯一性(或者在高流量期间可能会意外覆盖)
  • TimeUUID
    :将一次性提供您的时间排序和唯一性,但您无法从cassandra控制台工具中自行判断日期
对于任何类型的查询条件(作者、日期、大小等),都必须使用不同的行名称,因此请使用非规范化

易趣上的这篇由两部分组成的文章是一本不错的读物(我想我已经贴了一千次了):


你能给我一点精确性吗?你是如何在卡桑德拉坚持这一点的?Blob、SuperColumn(只有API保留并实际上是复合的)还是可组合的?还是上述的混合?您在这里给出的模式中的键、列名或列是什么?我还没有设计任何这种结构,因为我之前正在试图找出如何正确地构造它。上面的结构模型是我在概念上想到的,但我宁愿先考虑功能和速度。我需要在数据库外回答的主要问题是:“使用forumID=[id]为我提供[time1]和[time2]之间的所有帖子。”希望这对我在数据库外需要的功能有所帮助。谢谢,这对我帮助很大。。。我会发布一个答案。非常感谢你的帮助,我一定会调查此事。