中小应用关系型数据库设计基本思路
本文由发表于3年前 | 数据库 | 评论数 6 |  被围观 3,018 views+
抽取大字段到另一个表中对主表进行分表给主表建立一些字段的关联表,对关联表进行分表,并使用分表进行查询,加快查询速度

中小应用关系型数据库设计基本思路,个人见解,欢迎指正。

对于数据增长不大的A表,可以设计成一个表

A表

id(int) content(varchar 5000) audit_time(datetime) user_id(int)
1 外面下雨了 2014-08-31 00:10:12 1324
2 这是一个不错的主意 2014-08-31 00:12:12 2014
抽取大字段到另一个表中

对于数据增长比较大的A表,抽取出比较大的content字段,单独放入另一张B表中,从A表中移除该content字段;

B表,把content字段抽取到这个表中,减小A表的大小:

id(int) a_id(int) content(varchar 5000)
1 1 外面下雨了
2 2 这是一个不错的主意
对主表进行分表

如果不用根据这张A表进行复杂的排序查询,只需要使用ID进行查询,则可以直接把这张A表进行分表;

对A表分表之后,如果需要进行audit_time字段的排序查询,则可以把该audit_time字段抽取到另外的C表中,使用A该表的主键进行关联,这样按照audit_time字段排序查询的时候,直接从C表查找到a_id,然后根据a_id从A表获取完整的记录;

C表,这个时候对A表进行分表,把所有的A表记录都存放到C表中:

id(int) a_id(int) audit_time(datetime)
1 1 2014-08-31 00:10:12
2 2 2014-08-31 00:12:12
给主表建立一些字段的关联表,对关联表进行分表,并使用分表进行查询,加快查询速度

如果A表不适合分表,但是有些需求需要查找user_id字段值为1324的所有记录,则可以把user_id字段放入另一个D表中,对这张D表进行分表(可以对user_id 取模进行分表,如user_id为12,则12%10 = 2 则可以把该记录存入D表的第三张分表中),这样也可以加快根据user_id字段查找记录时的速度了。

D表,直接从D表查找符合user_id值的记录:

id a_id user_id
1 1 1324
2 2 2014

另外,可以适当的在分表中增加冗余字段,减少表之间的关联查询,从而提高性能。

以上是几种常见的场景,具体的分表策略还得根据实际的业务逻辑进行设计。

另外,为了减少数据库的压力,必要的时候,添加对象缓存和页面缓存,对于改动或增加比较频繁的数据,则可以考虑使用如redis之类的内存数据库

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/mid-app-rdbms-design-idea.html
关键字: , ,
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2014 8/31
文章评论
    6条评论
  1. godit 2014年09月01日15:38:09  #-49楼 回复 回复

    给主表建立一些字段的关联表,对关联表进行分表,并使用分表进行查询,加快查询速度::这个没懂意思,“有些需求需要查找user_id字段值为1324的所有记录”这个所有记录还是指主表的所有记录吧,那不放在一张表中更快,分表后还要关联查询,不分表就可以直接查出来。 疑问,请解答。

    • arthinking 2014年09月11日09:10:04 回复 回复

      根据索引字段进行精确查对数据库不会造成太大的影响,而数据量大的时候,进行连表的确会对数据库造成 比较大的影响。当主表的数据量太大的时候,可以不用关联查询,直接通过分表查找出user_id为1324的所有记录id,再根据这些id从主表中逐条取数据,可以根据数据量和业务进行设计。

      • godit 2014年09月11日22:54:10 回复 回复

        首页感谢您的回答。我明白您的意思了。但是这句还是有不明确的地方。
        “如果A表不适合分表,但是有些需求需要查找user_id字段值为1324的所有记录,则可以把user_id字段放入另一个D表中,对这张D表进行分表,这样也可以加快根据user_id字段查找记录时的速度了” A => D表,再对D进行分表(就是还要对D表进行拆分)?还是说把user_id放入D表中就是已经是对D表进行分表了。

        • arthinking 2014年09月12日09:05:57 回复 回复

          是这样的,如果业务的需求是只要在D表中按照user_id获取对应的记录,则可以分为n个表,使用 user_id % n 把记录存入对应的表中。

          • godit 2014年09月12日09:26:57

            good idea! 感谢您的回答。如果查user_id like 之类的模糊查询,是不是不支持。

          • arthinking 2014年09月12日19:06:44

            按照这种分表逻辑不支持这种查询的,使用 user_id like ‘%keywords%’ 这样的不会走索引喔,不建议这样使用。

给我留言

有人回复时邮件通知我
数据库的相关文章
随机文章 本月热门 热评
1 Lucene基本示例和关键类介绍 2013/1/11
2 对象引用循环导致的 net.sf.json.JSONException: There is a cycle in the hierarchy 2013/5/30
3 JSP的运行机制与原理 2011/6/17
4 ExtJS概述及其开发环境的搭建及遇到的Spket安装问题 缺少ext.jsb文件 2011/7/23
5 Ubuntu安装方案 超炫界面 VirtualBox让你从windows到Linux适应的完美过渡 2011/5/2
6 Sping使用单实例化简化多线程相关实现 事务 模板与回调 2014/4/7
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.