数据库表的设计思路
作为一个程序员你避免不了要设计数据表,总是一味地根据他人给出的表来写sql这样你永远也得不到成长。所以我现在要来思考如何设计出数据库表。
那问题来了,如何设计呢?这可是大问题啊...因为我之前就没怎么设计过表,我印象中我只设计过一次表,而且那次我记得设计的出了大问题,我要在毫无关联的两张表中查出2个有关联的字段,你看到这句话肯定很蒙,你一定会想问这字段到底有没有关联啊?有的,关联确实是有的,但是我设计的时候并没有把这两张表关联上,再加上当时数据库没学好,而且就剩三天就要验收程序了,慌啊,然后请教同学,他给一通操作整好了,我当时也没多想他到底是如何整好的。这也导致了我对表的设计还是一头雾水。
直到最近,我才有了一点想法。这个想法是这么来的,尽管我不知道表的设计,但是学过MVC框架,我知道MVC框架中必然会有实体,而一张表里的字段对应着实体里的变量,那我们不妨反过来想想,一个实体就对应着一张表,我们设计表不就是设计实体吗?实体有什么属性,表里自然也就有了什么字段。这几个实体究竟有什么关联,以什么作为关联的纽带,这便是我们接下来要考虑的东西,一个实体和另一个实体有没有可以关联的字段?有,好的,那我们给他添加上关联字段。没有?那我们再想想,有没有哪一个或哪几个实体能为他们的联系牵线搭桥,让他们联系上,如果有的话那这个设计就没有问题,至少是行得通的设计。如果没有,则说明这是一个绝对孤立的实体,没有任何实体能与它产生关联,那我认为这种情况就不应该存在,你设计出一个完全孤立的实体出来有什么用?拿来当观众吗?这时你就要想了,这个完全孤立的实体究竟有没有存在的必要,如果有存在的必要,那就建立中间表,把他们连起来,没有存在的必要,就想方设法把这个表里的字段往其他表里添。
话又说回来,实体怎么来?要看你的业务了,业务又从哪里来?就从项目最开始的阶段,需求分析来,所以说需求才是项目的重中之重,不信?你上网搜一搜就会发现,只有需求分析是要多次确认的,有一点不清楚的地方都不行,他有可能导致项目有较大的改动,很可能把之前的努力摧毁掉,所以这个需求分析你一定要做好。
还有一点,属于我还有疑惑的部分,那就是两个表的关联,是关联两个表的字段好,还是建立中间关联表更好,这个我还不太清楚,或者说这个要看情况而定,也希望大家能够给予我一些思路。
二次更新术,更新一些表字段使用的类型
每张表都具备id这个属性,而随着系统越做越大,id则会越来越多,所以他的类型应设为bigint(也可以是Long),长度设为20
是否启用(bool类型的东西)、类型(type),状态(state)类型应设为tinyint,长度设为1,一般设个默认值0
创建时间(createtime)应设为datetime类型,数据库也是有date类型,而我们用datetime而不用date的原因是datetime有时分秒,而date精确到天
普通的varchar类型字段建议设置默认值为null(empty string)
手机号可以使用char类型,因为手机号都是固定13位的,用char可以节省空间
对于内容字数比较多的时候你就不能使用varchar了,应该改用text类型