【发布时间】:2015-01-29 03:14:24
【问题描述】:
我正在尝试从 MySQL 迁移到 Cassandra,以构建我正在构建的音乐服务应用程序。
我已阅读以下 stackexchange:MySQL Data Model to Cassandra Help?
并检查了https://wiki.apache.org/cassandra/DataModel - 还有他们对音乐服务所做的 DataStax Cassandra 建模,但到目前为止的文档非常小而且很窄,我无法放弃 MySql 类型查询,所以我需要帮助.
这是我目前在 mysql 中工作的专辑表
CREATE TABLE `albums` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(150) NOT NULL,
`description` varchar(300) NOT NULL,
`release_date` int(10) unsigned NOT NULL,
`status` enum('active','inactive','pending') NOT NULL,
`licensor_id` int(11) NOT NULL,
`score` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `status` (`status`),
KEY `licensor_id` (`licensor_id`),
KEY `batch_id` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1720100 ;
我在下表中也有一对多的关系:艺术家(一张专辑有很多艺术家)、流派(一张专辑有很多流派)、歌曲(一张专辑包含很多歌曲)。
为了将它们耦合起来,我有很多数据透视表。
所以因为 Cassandra 不允许连接,所以我认为执行 set,list,map 可以帮助我解析到正确的数据集。
起初我的想法是通过重复使用同一张表来解决我的映射问题:
CREATE TABLE `albums` (
`id` int(10) ,
`title` varchar(150) ,
`description` varchar(300) ,
`release_date` date ,
`status` enum('active','inactive','pending') ,
`licensor_id` int(11) ,
`data_source_provider_id` int(10) ,
`score` int(10)
`genre` <set>
`artist` <set>
PRIMARY KEY (`id`),
) ;
(抱歉,如果上面的语法不是 Cassandra 的正确语法,我才开始在开发系统上安装系统)
我的查询如下:
- 给我所有按分数(降序)排序的专辑
- 给我一个特定流派的所有专辑,按分数排序
- 给我某个特定艺术家的所有专辑,按分数排序
- 给我所有按发行日期排序的专辑,然后按分数。
在 SQL 中,执行连接时 4 很容易 - 但是由于 Cassandra 不允许连接,我认为我的建模足够充分,但是无法满足 #4(据我所知,没有双重顺序) .
多个索引很慢,并且考虑到它在一个大型数据集上(目前有 180 万条记录,但我计划至少抽取三倍的数量,因此为什么 Cassandra 会很有用)
我的问题是:
1) 我从 MySQL 到 Cassandra 的路径是否正确,尽管我被困在 4 个问题上 - 还是它做错了? (我之前用 MongoDB 做过一些活动记录,您可以在文档中拥有一个子实体,但 Cassandra 只有 set、list 和 map)。
2) 如果我想将我的建模扩展为:“我想创建一个列表 X,其中包含来自专辑表的预定义数字元素”。将使用具有 X 的新字段“标签”标记每个专辑元素是过滤事物的明智方法,或者最好创建一个新表,其中包含我需要的所有元素并进行查询。
【问题讨论】: