在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;

同时建立两个索引表

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方案还是相对靠谱的。

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

用MySQL数据库来支持Schemaless的数据库存储方案相关推荐

  1. mysql存储emoji表情_MySQL中支持emoji表情的存储

    由于需要实现emoji表情评论的功能,所以数据库需要支持emoji表情的存储,根据查询的资料最终实现了该功能,现将实现的过程以及过程遇到的一些问题记录下来,供大家参考和交流. mysql的utf8编码 ...

  2. mysql存储ios表情_MySQL中支持emoji表情的存储

    由于需要实现emoji表情评论的功能,所以数据库需要支持emoji表情的存储,根据查询的资料最终实现了该功能,现将实现的过程以及过程遇到的一些问题记录下来,供大家参考和交流. mysql的utf8编码 ...

  3. [flask实践] 解决mysql数据库不支持中文的问题

    [flask实践] 解决mysql数据库不支持中文的问题 参考文章: (1)[flask实践] 解决mysql数据库不支持中文的问题 (2)https://www.cnblogs.com/xiaozh ...

  4. mysql支持的平台和操作系统_MySQL 数据库所支持的操作系统_MySQL

    MySQL数据库所支持的操作系统: 我们使用GNU Autoconf,因此将MySQL移植到所有使用Posix线程和C++编译器的现代系统是可能的.(要求服务器支持线程.如果只是编译客户端代码,则只需 ...

  5. mysql数据库增加模块_使用bind-mysql模块增加对mysql数据库的支持

    对于bind,如果想修改或增加dns记录,是直接修改文本的,这样的话一方面不方面管理,另一方面容易出错,如果我们增加对mysql数据库的支持,再配合php或perl,python等程序直接操作mysq ...

  6. mysql 数据库dbhelp_策略模式实现支持多种类数据库的DBHelp

    概述 需求 有时我们的系统需要支持多种数据库,如即要支持MSSQL server又要同时支持Oracle database.而如果我们为些实现两套数据库操作的方式,就会不能很好的达到软件设计的目标:高 ...

  7. 易语言外部数据库MySQL支持库Access数据库Sqlite数据应用

    语言虽然有自己的数据库, 但易数据库只是以简单的.类似表格的形式组织数据信息,是一个小型数据库管理系统.有时编程中必须使用其它数据库.易语言支持以ODBC方式和ADO方式操作外部数据库. 一.ODBC ...

  8. clob类型类似MySQL_Oracle中大文本数据类型Clob 长文本类型 (MySQL中不支持,使用的是text)Blob 二进制类型MySQL数据库Text...

    Oracle中大文本数据类型 Clob 长文本类型 (MySQL中不支持,使用的是text) Blob 二进制类型 MySQL数据库 Text 长文本类型 TINYTEXT: 256 bytes TE ...

  9. mysql支持中文_mysql数据库支持中文

    如果支持中文推荐将字符集设置成utf8可以一劳永逸,解决一些不必要的麻烦,对未来系统升级也可能有帮助.下面对设置方法进行列举 1.治标先治本,最好的方法就是在安装mysql的时候设置默认字符集为utf ...

最新文章

  1. C# 加载图片image --(C#)Image.FromFile 方法会锁住文件的原因及可能的解决方法
  2. 算法 有两个相同大小数组均已按升序排列好 编程计算这两个数组的中位数 C
  3. AdaBoosting 3
  4. Git 安装及常用操作配置
  5. matlab hist函数_算法工匠MATLAB专训营:Matlab绘图,小试牛刀
  6. SpringCloud实战与原理---快速入门
  7. 前端学习(664):逻辑中断逻辑或
  8. Qt模仿游戏拖装备(换装备)
  9. 执行脚本出现bin/bash: bad interpreter: No such file or d
  10. mysql 动态传入表名 存储过程_MySQL之常见约束以及事务和存储过程
  11. A browser for WinCE/Windows base WebKit. (zz)
  12. [Ext JS 4] 实战之Grid, Tree Gird 添加按钮列
  13. 微信JSSDK多图片上传并且解决IOS系统上传一直加载的问题
  14. [转载] python dict 查找原理
  15. 湖南理工学院图像处理与计算机视觉,信息与通信工程一级学科硕士研究生培养方案...
  16. 实用的活动报名微信小程序应用
  17. Git clean简介
  18. 手机网页版微信分享以及微信授权
  19. RobotFramework-关键字-Wait Until Keyword Succeeds
  20. PHP获取Opcode及C源码

热门文章

  1. 大二暑假周进度报告(三)
  2. Mac git 终端使用
  3. 微信小程序(11)--购物车
  4. Hack Into Linux Packet Schedulers
  5. 如何选择汽车LiDAR的激光器和光电探测器
  6. jenkins内存溢出的一些解决过程
  7. 重温JavaScript
  8. 升级openssh带来的问题
  9. Linux 第五天: (08月01日) Linux用户组管理
  10. 45种Javascript技巧大全