数据库设计笔记一

设计标准
什么样的设计是好的设计,设计又有什么样的目的?
各种环境下的各种人都会表达一下自己的看法,就目前来看,似乎没有一种统一的共识,也可能没有人做过总结。目前,从书本上,我们可能学习过第一范式、第二范式等,这种范式体适用场景有限.有些设计书讲的非常宽泛,有的时候并不适合我们。那么如何来做选择? 
开始,我们来明确设计的标准,根据设计的标准,那么才好去评价一个设计的好坏。 
设计首先是满足需求的。我们做东西都是有一定目的的,哪怕是以学习的目的,可能有的时候不会把目的放得很重,比如:出于好奇心,那么满足好奇心也是自己的目的。这里,我们不讲宽泛的目的,我们讲实现一个产品,做一个项目,完成一个功能所需要达到的标准。那么,在这里,需求就是我们的目的,我们的目的就是满足需求。这是我们这里最基础最基本的标准,也是必须要满足的条件;
设计最好是可扩展的。这里我们分性能扩展和功能扩展。性能扩展,网站的访问量存在很大的不确定性,在设计的初期,流量的预估是一个很重要的环节。当然,开始环节,我们的流量都是从无到小,从小到大。我们做一个月的准备,三个月的储备。假设就当前情况,你的设计是针对10wpv来做的设计,当你完成了项目的时候,发现网站很火,pv增长到了20w,那么对于这种增长,你的设计是否可以容易进行扩展。如果设计的不够好,那么很可能要重新设计。另外,功能方面,你的设计是否支持功能的增减。也许有人说,给我10w的需求,我就照着100w的设计。这种设计我们称之为“过度设计”,表示远远超出了能满足需求的设计。这种设计会造成资源浪费。因此,做这方面需要有一定的经验,需要对不同设计做出尝试、思考。
设计是方便维护的。如果有一天,你的网站访问不了了,你怎么很快地知道是哪里出了问题?可能是nginx没有启动,可能是数据库出现异常,也有可能PHP内的某个逻辑出了问题。线上故障拖一秒就可能损失一位用户,丢失的数据怎么处理?设计得不好,你可能一个一个查,甚至从头开始读源码,那么这样的设计是否是可维护的。方便维护的设计可减少故障造成的损失。因此,是否好的设计,也是我的一种评价。
以上三点,是我个人认为设计好坏的评价。当然,敏捷软件开发里也提到一些关于设计的话题,设计原则也是从此而来。有兴趣的同学也可以看看。
为什么选择MYSQL 
你可能会发现有各种各样的存储系统,文件存储,数据库存储,内存存储,还有第三方存储。如何做取舍?在这里,我们着重讨论数据库存储(以MYSQL为例)适用的场景。 
存储数据有需求,那么如果你的存储有如下考虑:



  • 可持久化存储

  • 支持数据筛选

  • 支持数据增删查改,并可以保证一致性

  • 支持一定容量和访问优化

  • 良好的错误处理

  • 稳定性良好

上面说的不清晰,我们举个例子吧。
存储一次性数据,一次存储,一辈子不变,我们选择文件存储。如:上传文件、静态化的数据等;
存储一篇博客,以后可能会改,会动态增加、删除,那么选择数据库;
对数据及时性要求非常高(1s内的时延)、计算性能要求较高,数据量不大,选择内存;
如果存储的东西不考虑类型,不考虑实现方案,又愿意给钱,那么就使用第三方存储吧。
以上仅是个人的一些经验,给大家做一个参考。
使用MYSQL
这里,我们针对的是有一定经验的PHPer,因此,我们不会对MYSQL做非常细致的讲解。
不过,我们会针对我们要使用的内容,对涉及的知识,做介绍。
这里,我们着重描述几个常见的操作以及注意的地方。
建表(create)
一般情况下,这种操作一般会在设计初期完成,而且是一次性的工作,需要注意的地方不多,就一点:做好备份,方便后续更新;
设计时,对某些自己插入时不想写入的字段,给出默认值;另外,需要注意:字符集、索引、主键、字段类型。
修改表(alter)
一般情况下,这种不会带到线上来做。修改的时候,需要注意一下新增字段的位置
删除表(drop)
一般情况下,这种不会带到线上来做。但是需要注意:这个操作不可逆,一单操作,意味着数据都丢了。
插入数据(insert/replace ignore)
插入数据时,尽量写全;配合创建表时的默认值使用,当然,也可以不考虑,在这里给出;
这里需要注意:索引的冲突;
更新数据(update)
更新数据尽量使用where来筛选;
筛选的条件使用索引;
删除数据(delete)
尽量使用软删,即使用标记字段来表示一个字段被删除了,同时,不破坏表的存储结构;
查询数据(select)
查询字段可以不使用就不使用;一个是mysql自己的计算,一个是带宽,一个是PHP内存占用;
查询条件使用limit限制数据;
where条件,根据区分度选择使用索引;
order by尽量使用主键,可使用索引; 
以上,特殊情况特殊项目除外
讨论



  • 哪些操作需要特别小心?任何可以改变数据内容的操作,都需要小心;小心的意思是说,在你打算做这个修改之前,先考虑充分。

  • 老师可以举例讲一个实际项目中,如何设计数据库和表吗?
    会的,我们会以一个留言板的项目来设计数据库和表。

  • 老师会把数据库讲到什么层次?
    会讲到我目前的水平:可以完成大部分的数据库的设计,给出各种功能需求的解决方案。

  • 下面这两个查询,哪个效率高? 

    $sql_1 = "SELECT * FROM table_a WHERE account='abcdef' AND reg_time>'2013-01-01'";
    $sql_2 = "SELECT * FROM table_a WHERE reg_time>'2013-01-01' AND account='abcdef'";
    一样高。之前我一直以为左边的会在右边的之前做区分度,后来跟一位同学研究时发现,这个效率是一样的。
  • explain怎么使用?
    后面我们专门准备一节来讲吧。

  • 多库操作,读配置文件?
    是的,一般我们是这么做的。


转载于:https://my.oschina.net/u/998304/blog/363221

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值