数据库表设计思路(数据库表的设计思路)
数据库设计
数据库设计指的是根据业务需求建立数据存储模型,简单地说,数据库设计就是表设计,把需要记录的数据合理地分散在不同的表当中。数据库设计能直接影响到整个网站系统的质量,其重要性是不言而喻的。
一般情况下,数据库设计很大程度上取决于具体业务需求和设计者偏好。
对于某个具体的数据库设计,很难界定其是否是最优的设计。因此,最优数据库设计其实是一个开放性问题,没有绝对的标准。数据库设计只要在一定程度上平衡好“数据冗余”和“数据操作的性能”就可以了。
说明:关于数据库设计,有很多规范和原则,如范式等。但是这些规范和原则只能优化已有的数据库设计,而不能从无到有地指导数据库设计,所以在这里不展开介绍。
对于大型网站而言,其数据库的内部结构是十分复杂的。复杂的数据库结构会带来维护或扩展的困难。因此,大型网站的数据库需要处理好两个问题以达到降低复杂度的目的:分离数据库和限制关系层级。同时,这两个问题的解决思路也可作为指导数据库设计的思想。
1.分离数据库
一个数据库中包含多张表是不可避免的事情,但是如果一个数据库中有几十甚至上百张表则会出现非常混乱的情况。因此,数据库设计需要分离数据库,避免出现一个数据库包含过多表的情况。
分离数据库需要根据具体业务而定,因此,分离数据库可以参考业务架构。
在2.1.1小节“业务架构面临的挑战”中曾强调,业务架构需要划分出功能模块,而这些功能模块大多是相互独立、互不影响的。在数据库设计中,可以为这些功能模块分离出独立的数据库。分离数据库后,每个数据库的复杂度就会降低(表的个数减少),较低复杂度的数据库在进行维护或扩展时都相对
容易一些。以一个视频平台为例,根据业务模块分离数据库后,可独立出用户库、资源库、发布库及统计库等。如果后端应用程序也是根据业务模块分为相互独立的几个后端应用程序的话,那么某个业务模块的后端应用程序和数据库就可以看作一个整体,一个可以根据业务模块垂直拆分出来的整体,如图4.68所示。
图4.68 根据业务模块垂直拆分出后端应用程序和数据库
在实际网站系统当中,即使是相互独立的业务模块,也难免在功能上有所关联,如“资源”业务模块中需要记录资源所属用户,“发布”业务模块中需要记录使用的资源等。因此,每个数据库都应该提供一个主要属性供其他数据库使用,以满足业务功能的需求,如图4.69所示。一般情况下,一个数据库只对外提供几个主要属性。
图4.69 数据库提供主要属性供其他数据库使用
说明:主键指的数据表中的一个或多个字段,主键可以唯一标识数据表中的某一条记录,每个数据表至少需要设置一个字段作为主键。外键指的是数据表中的一个字段,这个字段可以与其他数据库产生关联,外键一般是其他数据表的主键。
分离数据库后,不同数据库的数据是相互隔离的,不可以跨数据库操作数据。数据库分离无疑会增加后端应用程序的复杂度,分离数据库之前,通过一个SQL语句就能实现多表操作,而分离之后,只能通过多次操作数据或者联合多个接口才能实现。
说明:如果多个数据库运行在相同的MySQL实例当中,可以通过“视图”联合查询多个数据库的数据。如果多个数据库运行在不同的MySQL实例当中,也可以通过“数据库同步”的方式让数据同步到同一个MySQL实例当中,然后通过“视图”联合查询多个数据库的数据,但是这种方式查询到的往往不是实时数据。在大型网站系统当中,这些方式都是不被推荐的。
这种由于分离数据库造成的限制是良性的,因为一个SQL语句实现多表操作是非常损耗性能的,而且可能会阻塞其他数据操作(影响并发能力)。数据库分离后,这种不被推荐的“一个SQL语句实现多表操作”就会被强制减少,从而减少后期优化数据库操作的工作量。再者,分离数据库能让开发人员强制遵循“模块垂直划分”的原则,让程序保持结构整洁。
2.限制关系层级
分离数据库后,单个数据库里的表设计可以根据业务模块的子模块划分。
但是如果只按照子模块分表的话,可能会出现过多冗余数据的情况,而降低冗余数据的方法是增加子表。一旦分离子表,就会有关系层级,这个层级一般不要超过两层,否则表的关系会变得复杂,操作数据也会变得复杂。
以视频平台的“资源”数据库为例,由于一个视频资源往往需要转码成“高清”“流畅”等视频,所以“资源”数据库需要分离出“转码视频”表和“原视频”表,如图4.70所示。其中,“转码视频”表中也可以再分离出子表(如转码模板等),但是一般不建议这么做,因为“转码视频”表已经处在第二关系层级,如果再细分子表的话,数据库结构会变得复杂,同时数据操作也会变得烦琐。
图4.70 将“资源”数据库分离出“转码视频”表和“原视频”表
以上对数据库设计的介绍当中,只考虑了业务需求。而在大型网站系统当中,往往会出现查询或操作某些数据比较集中的情况,而这部分数据,需要做特殊处理(合并数据库或拆分表)。也就是说,大型网站系统的数据库设计除了要考虑业务需求以外,还需要权衡使用场景带来的数据操作压力。
3.数据库管理工具
数据库设计完成后,就可以构造数据库了。构造数据库当然可以通过SQL语句实现,但是通过SQL语句构造或维护数据库是一件十分麻烦的事情。所以在“构造数据库”或“数据库维护”时,一般使用有操作界面的数据库管理工具。以MySQL数据库为例,可以使用Navicat for MySQL作为数据库管理工具,如图4.71所示。
图4.71 Navicat for MySQL的操作界面
本文给大家讲解的内容是大型网站架构的技术细节:后端架构数据库–数据库设计下篇文章给大家讲解的内容是大型网站架构的技术细节:后端架构数据库-数据库操作框架感谢大家的支持!
如发现本站有涉嫌抄袭侵权/违法违规等内容,请<举报!一经查实,本站将立刻删除。