用MySQL数据库来支持Schemaless的数据库存储方案_MySQL

php中文网
发布: 2016-06-01 13:44:08
原创
1448人浏览过

bitsCN.com

懒人居- coding for fun要生猛的面对生活

用MySQL数据库来支持Schemaless的数据库存储方案

在PyCon上有童鞋提供了一个类似概念的分享,不过不大适合一般类型的互联网项目,感觉有点过于另类。不过我实现这个方案是在看到PyCon的分享之前。算是同样的诉求不同的实现方式吧。且我这里只是实现了一个数据访问的组件而不是Server。

 

首先本文的方法来自FriendFeed分享的如何使用MySQL数据库的分享。简而言之就是把Python对象直接dumps后zip压缩存储在MySQL一个字段里。这样不就Schemaless了么?存什么数据类型,类什么结构,MySQL都不需要知道,加个属性什么的都不需要修改数据库表结构,对于业务快速变更、快速增长的互联网业务来说再合适不过了。访问对象直接通过主键查询,快速直接。but,查询怎么办?有的童鞋可能会问。OK,查询这事得分两说,如果是简单的检索,可以通过建索引表的方式来解决,或者呢用外部的索引,比如lucent,还能全文检索哦。现在而今眼目下我实现了索引表索引的方式,因为外部的索引方式比较千奇百怪,所以如果需要可以根据具体情况自己来写一个,反正实现相应的几个方法就行。

 

直接上一个例子来说明。假设要实现一个blog,需要存blog的信息,先定义一个blog的模型类(需要import什么大家自动脑补)

 

1 class Blog(DynamicBase):2     title=Column(unicode,max_length=200)3     content=Column(unicode)4     post_date=Column(datetime.datetime,db_index=True)5     auther=FkColumn(User)6     class Meta:7         table_name="blogs"8         connection=connections[DB]复制代码

这个connection是因为我还没想好如何能无缝结合到Django中又能兼顾脱离Django独立使用的暂时措施,完成版会去掉

 

如果在使用django的话只需要python manage.py shell 然后Blog.objects.create_table()

 

这个时候会自动创建模型定义的表和索引表

 

数据表blogs:

 

CREATE TABLE `blogs` (

`id` int(11) NOT NULL,

`object` varbinary(20000) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

云网OA
云网OA

采用JSP开发的办公自动化产品、基于B/S结构,运行环境:JDK v1.5、Tomcat v5.5、MySQL v4.1,三者均为以上版本其他相关内容:可视化流程设计: 流程支持串签、会签和分支流程,可以设置流程节点的修改、删除权限,并可指定流程中各个用户在表单中可以填写的域。智能表单所见即所得设计: 智能设计,自动在数据库中生成表格,方便优化程序 公共交流: 集论坛、博客、聊天室于一体文件柜:C

云网OA 0
查看详情 云网OA

 同时建立两个索引表

 

CREATE TABLE `blog_idx_post_date` (

`id` int(10) unsigned NOT NULL,

`post_date` DATETIME NOT NULL,

PRIMARY KEY (`id`),

INDEX `idx_blogs_by_post_date` (`post_date`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

 

CREATE TABLE `blog_idx_auther` (

`id` int(10) unsigned NOT NULL,

`auther` INT NOT NULL,

PRIMARY KEY (`id`),

INDEX `idx_blogs_by_auther` (`auther`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

 

这个时候,可以通过Blog.objects.create(title=u"标题",content=u"内容",post_date=datetime.datetime.now(),auther=user) 或者Blog.objects.create(title=u"标题",content=u"内容",post_date=datetime.datetime.now(),auther=user.id)

 

就能够创建一个Blog的对象。这个时候blogs表和两个索引表都会插入数据。不过blogs表中的object列是人类无法理解的火星文..........

 

通过id直接获取对象  Blog.objects.get(1),根据索引获取  Blog.objects.auther.query(auther=user.id) 或者  Blog.objects.auther.query(auther=user)

 

这个会生成SQL,SELECT `id` FROM  `blog_idx_auther` WHERE `auther`=%s 然后取出match到对象的id列表,然后遍历id列表,通过Blog.objects.get(id)获得的对象列表。

 

Blog.objects.get(id)的时候是有对象缓存的(现阶段通过redis实现),所以经过测试,速度是靠谱的。而相对MangoDB来说,MySQL的数据存储也更加靠谱一点,所以相比换现在而今眼目下还不怎么靠谱的mangodb来作为主存储来说,基于MySQL的Schemaless方案还是相对靠谱的。

 

 

 

由于现在这个东西还是处于在项目中孵化的阶段还没有能够达到可以独立开源出来供大家娱乐的程度,所以请大家对这个方案多提意见建议咯,源代码估计能够在春节后达到能够公布出来见人的阶段

 

 

亚历山大同志

bitsCN.com
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号