数据库三范式(NF)

数据库在优化的时候我们主要通过四个方面进行考虑:

    1.数据库设计的合理性(多针对表结构的合理性)。

    2、sql语句的结构优化

   3、数据的配置(多针对缓存而言,牺牲空间来换取时间)

   4、在我们的硬件配置和操作系统的选择上进行考虑。

今天主要介绍数据库设计的合理性这部分:

      所谓数据库表设计的合理性,主要是看我们设计的表是否遵循了三范式。

    第一范式:要求我们的数据具有原子性和不可分割性。在关系型数据库中,默认就遵循了我们的第一范式。

    第二范式:在满足了第一范式的基础上,再考虑我们的第二范式即:一条记录的唯一性。

                     所谓的唯一性其实大多是在我们的数据库中设置一个主键,避免重复。

    第三范式:在满足第二范式的基础上,我们再考虑第三范式即:我们所需要的的信息,可以通过表之间的关联关                        系来获取,不需要在多个表中添加相同内容的冗余字段。

 从普通表的设计而言,满足这三个范式,就进行数据库表设计的基本要求。

  但是凡事没有什么绝对的。根据具体的需求有时候我们需要进行一种逆范式的表设计:

  例如我有一个需求 :

                   两个小队,每个小队10人,在参加一项比赛,我需要你把个人总得分,和小队的总得分数查询给我。

             这个时候如果使用范式设计是这样的:

                

          你有没有发现有什么问题?  如果没有,说明你在编程习惯有问题,只停留在了用的阶段,没有思考。

              诚然我们可以通过编写sql语句的方式来遍历整个队员表,通过id或指定的小队,拿到每个人的分数相加

              最后得小队分数。然而这样就造成我们查询的数据过于庞大,你想想我们需要拿到所有队员的分数,再加起来,如果队员有上千人,我就要遍历上千次。

        这个时候逆范式就有了用场,我在team表中也添加一个分数的字段。


添加一个触发器,当某个小队的人分数加1时,我就触发team表中队员的team_grade字段加1

这样在查询小队分数时,我们只需要查询到一条数据,便可以取出值。极大的节省了时间。

然而需要注意的是在使用逆范式时,需要注意,在一对多的关系中,可关联到的类似冗余字段一定要在一的一方进行设置,否则就成了画蛇添足。



                    

你可能感兴趣的:(mysql优化)