`

数据库设计经验分享

 
阅读更多

 
 
MySQL
数据库设计经验分享
 
其实这个经验分享并不仅仅针对
MySQL
,之所以加上这个关键字其实是为了给搜索引
擎看的,呵呵。这篇文章的目标是为了拓宽新手的思路,对于老鸟可能没什么帮助了。
 
文章主要涉及以下方面的内容:
 
1.
 
数据完整性约束的意义:数据的第一道防线;
 
2.
 
避免冗余字段:请不要认为这是一种弹性或者灵活性的体现;
 
3.
 
请尽可能的收集数据:这是一种境界;
 
4.
 
为什么建立索引:不仅仅是速度;
 
5.
 
事务、触发器与存储过程:这是一扇门;
 
 
数据完整性约束的意义
 
很多新手创建的数据库非常的简单,一堆字段扔进去就搞定了,反正脚本会搞定一切。
但是,
你有没有反思过一个问题,写脚本的也是人,是人就会犯错误,
犯了错误就可能搞乱
数据,而数据是一切应用的基础。因此,我建议你们能够静下来,细心的,花费更多的时间
来研究如何更好地设计数据库结构。
 
主键是必须的
 
这是我的第一个建议,
每个表必须具有主键,
而且最好是使用单独的一个字段作为主键,
这样从根源上扼杀了出现两条完全相同的数据的可能性。
 
你可能需要额外的唯一键
 
例如用户信息表中,
除了用户编号以外,
其登录名称也应该是唯一的,
不要指望以后可
以在程序中处理这个情况,
现在就做,
只要把它标记为唯一键,
就算程序中忘了判断也不会
让错误的数据被存储进来。
 
字段的类型和长度
 
请努力使用与数据匹配的类型和适当的长度,虽然你可以把时间保存为
varchar
类型,
但是明显还是
datetime
类型更好,因为你不可能把
2013-02-30
之类的日期保存到
datetime
类型的字段中。
字段的长度也是需要考虑的,
过长虽然比过短带来的麻烦小很多,
但是浪费
了很多空间。
 
默认值
 
尽量为字段设置默认值,例如字段
is_read
用来表示用户是否已经阅读过这条留言,
1
表示已读,
请为它设一个默认值
0
来代表未读,
而不是在日后的查询语句中通过
is_read<> 1
或者
is_read = IS NULL OR is_read = 0
来判断。
 
允许为
NULL
吗?
 
这个问题需要思考,
而不是一概允许或一概不允许这种模式化的判定。
同时,
建议不要

NULL
作为一个特殊的值来使用。
 
外键约束是必不可少的
 
你必须理解和开始使用外键,
并且明白外键约束的用法,
这是维护数据完整性很重要的
一环。
建立外键的同时你会对程序的业务逻辑有更清晰的认识。
正确的使用它防止误删具有
依存关系的数据,同时通过级联删除保证在删除的时候不留下任何垃圾。
 
 
避免冗余字段
 
千万不要认为冗余字段能够使数据表更有弹性、
更灵活。
首先来说冗余的字段必然都是
允许为
NULL
的,因为没有适合的代码为这些字段赋值(如果有的话那就不是冗余字段了,
对吗)
。这只会增加数据表的体积。事实上修改表结构仅需几分钟,真正的麻烦还是来自于
为新字段添加相应的业务逻辑。
 
而且事物总是在变化的,
今天你觉得未来可能会用到这个字段,
但是可能下个星期就不
这么想了,一个月之后你根本不记得当初留了这么一个字段。所以,删了吧。
 
 
尽可能的收集数据
 
其实这有点跑题,因为这不仅仅是数据库设计的事儿,程序员可能也要付出一些时间。
我一贯的观点就是“数据是一切应用的基础”
,尽量的收集它们,以后也许会有用(如果这
个应用有一个长远的预期的话,否则你可以忽略这点)

 
我无法想象
Google
,百度或者淘宝明天会做什么,但是我能肯定它们的业务调整的依
据就是来自这些捕获的数据。
 
尽可能的收集数据是指在不增加用户操作指令的前提下尽可能的收集一些相关信息。

如各种时间、
浏览页面的轨迹等等。
我甚至怀疑以后某些应用会收集用户击键频率这样的信
息,然后利用它来检测账号是否被盗。
 
此外,我觉得应该尽量在插入
/
修改
/
删除数据的时候多做一些事情,相对来说,这些操
 
 
作不那么频繁,
而且单次操作的数据量也更小。不要将压力都留给查询语句。例如,如果你
的程序中需要使用类似
SELECT *, SUM(`point`) AS `total_point` FROM `table` GROUP BY
`user_id`
的语句的话,不妨考虑为这个表增加一个
total_point
字段。
 
为什么建立索引
 
如果某个字段,或一组字段会出现在一个会被频繁调用的
where
子句中,那么它们应
该是被索引的,
这样会更快的得到结果。
同时,唯一索引的用途前面提到了,恰当的使用它
们,避免意外的发生。我个人不推荐使用全文索引,尤其对于汉字来说,全文索引的开销太
大了,
我宁可选择搜索引擎提供的站内搜索功能。
虽然搜索引擎的收录不是很及时,
但是我
觉得也不是不能接受。
 
再说一次,我觉得应该尽量在插入
/
修改
/
删除数据的时候多做一些事情,相对来说,这
些操作不那么频繁,而且单次操作的数据量也更小。不要将压力都留给查询语句。
 
 
事务、触发器与存储过程
 
哦,
事务处理其实是程序中要做的事情,
多条数据操作语句应该放入事务处理中,
我们
需要随时注意保证数据的完整。
 
触发器和存储过程可以减少程序中的
sql
语句数量,同时减少了程序与数据库之间通讯
带来的损耗。
 
特别是触发器,
它能极大的帮助我们,
本站的数据库设计中就使用了它,
例如你发表回
复或删除回复的时候会触发一个更新文档回复数量的操作。不过由于
MySQL
数据库中级联
操作无法使触发器触发的怪癖可能需要你做更多的处理才能让触发器顺利工作。
 
 
结语
 
请认真而仔细的设计你的数据库,
并且使表名称和字段名称都易于理解并避免混淆。

如,代表删除状态的字段最好命名为
trashed
表示已删除,而不是
trash
,明显的,当你看到
值为
1
的时候前者你能明白这表示已经删除了,而对于后者你恐怕就拿不准了。
 
你可以想象为数据库结构是软件的等比例模型,
就像是售楼处的模型一样,
它只会比实
物更漂亮而不是更丑。
所以如果你的数据库不够美观,
你的软件质量基本已经定性为不堪入
目了。
 
如果你有什么意见和想法可以
点击这里打开原文地址
并通过回复的方式告诉我,
只有注
册用户才能回复哦。呵呵。

分享到:
评论

相关推荐

    小区物业管理系统数据库设计

    小区物业管理系统数据库设计 小区物业管理系统数据库设计是指为小区物业管理提供的一种信息化管理系统的数据库设计。...小区物业管理系统数据库设计的缺点是需要小组成员具备团队协作的精神和数据库设计的经验。

    搜狐畅游数据库运维经验分享

    - **早期**(2008年前):不规范阶段,人手、经验有限,硬件老旧,故障频发,数据库设计与监控不足。 - **中期**(2008-2010):逐步完善,增加人力,硬件升级,监控、安全、自动化提升,故障率下降。 - **当前**...

    公司数据库设计规范,提供数据库设计的项目经验

    本文将深入探讨"XX公司数据库设计规范",分享实际项目经验,帮助读者理解并掌握数据库设计的关键要点。 首先,规范化的数据库设计是确保数据一致性、完整性和可维护性的基础。在XX公司的实践中,遵循以下主要步骤:...

    2011-06-25_游戏数据库运维经验分享

    ### 游戏数据库运维经验分享 #### 一、引言 随着互联网技术的快速发展,网络游戏逐渐成为人们娱乐生活的重要组成部分。然而,在享受游戏带来的乐趣的同时,背后支撑这一切正常运行的游戏数据库运维工作却鲜为人知...

    搜狐畅游数据库运维经验分享.pdf

    ### 搜狐畅游数据库运维经验分享 #### 一、背景与挑战 随着网络游戏行业的快速发展,作为国内知名的游戏开发商之一,搜狐畅游面临着前所未有的挑战。特别是在数据库运维方面,随着在线用户数量的激增以及游戏种类...

    CMS之数据库设计.docx

    本文档探讨了一位程序员在设计CMS数据库时的思路和方法,旨在阐述其独特之处并分享经验。 首先,作者意识到现有博客平台在内容管理和展示上的局限性,如仅支持一级分组,缺乏多级分类和清晰的导航结构。因此,他...

    图书馆管理数据库设计

    - **实践经历分享**:通过参与项目获得的实际经验和教训。 #### 八、存在问题与建议 - **问题分析**:指出设计中存在的不足之处。 - **改进建议**:提出改进建议,进一步完善系统。 #### 参考文献 - 列出设计...

    学生学籍管理系统数据库课程设计.pdf

    《学生学籍管理系统数据库课程设计》是一份详细探讨如何构建这样一个系统的报告,旨在提升教育管理的效率和准确性。...通过这样的实践,学生可以深入理解数据库设计原则,提高问题解决能力和项目实施经验。

    仓库管理系统数据库设计报告

    《仓库管理系统数据库...总之,《仓库管理系统数据库设计报告》是一个全面的实训资源,不仅涵盖了数据库设计的基础知识,还包含了实战经验分享,对于参与建桥数据库实训的学弟学妹们来说,无疑是一份宝贵的参考资料。

    数据库设计报告(图书馆数据库)

    6. **心得体会**:开发者分享了在设计和实施过程中的经验与感悟。 7. **参考文献**:列出设计过程中参考的相关资料。 该图书馆数据库系统充分考虑了图书馆的业务流程,包括读者分类、读者信息、书籍分类、书籍信息...

    优化MySchool数据库设计_第1章上机练习.zip

    《优化MySchool数据库设计》是针对数据库设计领域的一份学习资料,主要聚焦在提升数据库性能和效率的主题上。...通过田超凡的教程,读者有望获得宝贵的实战经验,进一步提升数据库设计和管理能力。

    结合业务的数据库设计文档

    本文档旨在分享关于如何结合业务逻辑进行有效的数据库设计,帮助读者更好地理解并掌握这一技能。 #### 二、数据库的重要性 1. **根基作用**:正如引言中提到的,数据库是软件项目的根基。一个稳固的数据库设计能够...

    数据库课程设计 论坛管理信息系统

    在信息技术领域,数据库设计是至关重要的组成部分,尤其是在构建管理信息系统时。在这个“论坛管理信息系统”的课程设计中,学生将深入理解如何使用数据库技术来构建一个有效的在线讨论平台。这个项目涵盖了从需求...

    赢在起点-数据库设计规范 梁敬彬大牛的经验之谈

    《赢在起点-数据库设计规范》是梁敬彬大师关于数据库设计的一份宝贵经验分享,主要涵盖了Oracle、MySql和DB2这三种主流数据库系统。本文将深入解析该主题中的关键知识点,帮助读者理解并掌握数据库设计的核心原则。 ...

    《数据库》课程设计文档

    《数据库》课程设计文档是为本科学生准备的一份详尽的教学资料,旨在通过实践操作来深化对数据库理论的理解。...在交流过程中,同学们可以分享各自的项目经验,共同探讨和解决问题,进一步加深对数据库设计的理解。

    数据库课程设计实习报告

    心得体会部分,陈剑同学可能分享了在数据库设计、编程实践以及团队协作中的感悟和经验收获。 【附件】 附件包含了关键查询语句示例和报表打印模板,提供了具体的操作指南和技术参考。 总的来说,这份实习报告详尽...

    DB2数据库经验教训

    标题与描述概述的知识点主要集中在DB2数据库的深入理解和实践经验分享上,涵盖了DB2的专有名词、编程技巧、性能优化、系统管理以及与其他系统的交互等多个方面。以下是对这些知识点的详细解读: ### DB2专有名词...

    sql.rar_SQL 数据库设计_SQL代码_sql数据库_数据库 课程设计

    在进行课程设计时,可能会参考该网站上的教程、例子或其他开发者的经验分享。 总的来说,这个课程设计提供了实践SQL和数据库管理的机会,通过处理学生成绩管理的具体场景,学习者可以加深对SQL语法的理解,掌握...

    数据库大会资料分享

    【数据库大会资料分享】 在本次数据库大会中,与会者分享了关于数据库管理、优化以及大规模数据存储的宝贵知识。这些资源涵盖了从源码解析到实用工具的应用,为数据库管理员(DBA)提供了深入理解数据库运作机制和...

Global site tag (gtag.js) - Google Analytics