日期:2014-05-16  浏览次数:20453 次

再次讨论数据库设计

        在大致了解需求之后,就非常急切编码,而不是拿出一段时间来思考数据库的设计,这种做法是非常不专业的,也是我们应该避免的。数据库是我们软件大楼的根基,我们一定要重视起来,因为如果不重视,会出现很多诸如输出数据错误、性能差和难于后期维护等问题。

        所以数据库设计很重要。

        那么如何设计出来一个好的数据库呢?

        这是一个不太好回答的问题,其实设计出好的数据库这个问题本身就是一个相对的概念,没有绝对好也没有绝对不好。这个要看具体情况,而且这个问题也是一个循序渐进的过程。

        但是这个问题还是有一个设计根基,也就是我们的数据库设计三范式,三范式很明白了告诉我们如何设计出来一个设计良好的数据库(这里的设计良好代表着:在某种程度上减少冗余,保持数据一致性等)。我们在三范式的根基上,考虑相关业务应用的特殊性,来设计我们的数据库才有可能设计出来一个好的数据库。

         因为三范式在有些时候也是相对的,因为我们在什么时候把“河北省廊坊市”拆成两个字段存储,还是把“河北省廊坊市”当作一个字段存储的情况都会发生,要是按照三范式可能我们就要选择第一种了。所以三范式不是万能的法宝,还是要看相关业务。

         这也就是我们所说的世界上没有绝对的,唯独只有变才是不变的道理。

        在数据库设计的范畴中,有两个概念即OLAP和OLTP。一个是联机分析处理,一个是联机事务处理。联机分析强调的是数据查询和整合分析,数据修改较少,而联机事务则强调数据修改较多,对数据一致性要求较高。这就对应着两个系统,一个系统对查询的性能要求很高,方便数据的可移植,一个系统对数据完整性和一致性要求较高。因此我们在做系统设计时必须搞清楚系统的特性,如果是查询性能高而且数据结构的修改较多,那么在数据库的设计时就不能完全遵循三范式,因为这样数据库会有一定的自检策略而且比较消耗性能,相反则更能很好的保证数据的正确性。【摘自:《灵活运用数据库主外键》】

        也就是我们要在对理解业务的时候,要更加深入的分析系统是什么类型的,是强调查询的还是强调增删改的。针对不同的类型建立不同类型的数据库。适合才是最正确的,也是设计最好的。

        还有,我们在设计数据库中有时候是非常需要考虑扩展性的,而我们在软件开发的时候会发现范式考虑扩展性问题的时候,肯定会带来冗余。这也是典型的鱼和熊掌不能兼得的问题。当我们有两个表结构有关系的时候,我们会选择主外键来维护这种关系;还是用一张第三张表结构来维护这种关系,就是这样一种问题。前者效率好,便于维护,但是扩展性上有些问题;后者冗余度大,难于维护,扩展性好。这个时候还是要看具体应用来说话,如果我们的应用对扩展性要求非常高的话,我们就要考虑一下后者,如果我们的应用对效率要求特别高的话,我们就要选择前者。这是一个选择问题,面对什么的情况选择合适自己的才是最正确的。

         关于数据库的如何设计,这是一个需要反复推敲的问题,需要我们不断的在设计,不断的在修改,不断的重新思考和反思的一个问题。没有什么人一开始就能够设计出来非常合适的数据库的,所以在这个问题上需要经验,经验从何而来?就是在不断的去做,不断的去改,循环中得到的。

 

3楼lushuaiyin昨天 18:26
我也做过数据库设计,不过我设计的原则是考虑需求,功能,效率,扩展。并保证逻辑合理,在大学也学过范式,不过到现在我对那个范式还是不感冒,在我看来就是合不合理,范式有点把问题抽象了
Re: lfsf802昨天 20:59
回复lushuaiyinn凡是事物和定义和定理的存在一定有他的道理,所以数据库三范式也是这样的,他就是给我一个形式,这样设计是比较合理的,但是没有说我们一定要严格按照这样来,就像我文中说的没有绝对的事情,只有变才是不变的。所以我们还是要看需求,需求和范式应该结合着用,找到适合的才是正确的
Re: lushuaiyin3小时前
回复lfsf802n道理这么说是没错,但是我之所以不对范式感兴趣还有原因。以前有个五笔输入法,大家都知道吧,刚学计算机的时候,也就是初中,老师叫我们五笔输入法,给我感觉就是学计算机的都应该会五笔。现在呢,我终于明白,五笔只不过是个输入的工具,而且是个失败的工具!对于初学者本来兴趣是很浓的,一学五笔都觉得计算机很难用,我甚至把口诀都背的滚瓜烂熟,还是不会打字!!!对于所有中国人来说五笔输入法就是个大忽悠!我不想说范式也是一样,但是起码会做设计的人不一样懂范式是什么,如果你的设计很庞大,很复杂,这些高深的理论还是有必要的。还是那句话,多做,多想,少听别人忽悠
2楼lfmilaoshi3天前 14:40
经验从何而来?就是在不断的去做,不断的去改,循环中得到的。
1楼lbq6136133天前 11:25
恩,细节还是得看需求!