前几天遇到一个项目,大概情况是这样的,有一个用户在网站上开启课程,但是该课程对应的实际是一本书籍,该书籍有章节目录,但是在节目录下面又有一些东西比如该小节下的上课学生关联,还有该章节下的其他东西关联暂且不说。
经过分析以后我个人的建议是一张表解决问题,采用id parent—id 树形结构设计关系来关联,书,章,节三个关系,但是设计者设计方式是按照基本三大范式来设计的,三个关系既然是一对多对多,那么他就设计了三个表,结果每次做复杂查询的时候要5.6个表连接,我认为效率很低
我想问的是到底如何设计才是合理,同时扩展性和容灾性,外键如何保证?我想需要一个经验多的大牛指导一下,不过我确实想请教的意思,这个是个典型设计案例。
我有几个问题:
你能告诉我吗,我也试试想想看
------------------------------------------
我觉得最好遵循范式,虽然查询麻烦,但是容易看明白,易维护和扩展,用一个大表的话如果新手接手会看不懂的。当然模型的创建也依赖于具体的需求,如果你能说的更详细一些,我也设计一些模型,咱们再讨论,谢谢。(我不是高手,呵呵)
单表和多表
要看书、章、节的相似程度,如果相似度很高,可以用一张表;所以应该先把几个主体的特点描述出来,区分共性和特性,看看要多大的相似度。
关于表级联
即使是一张表,也要涉及到自表级联。效率的优化要考虑索引的建立、sql查询的优化(比如先筛选,再级联、嵌套子查询)。
遵循范式,采用多表。原因是扩展性高,维护性高。至于效率问题,因为多表数据每张表的数据更单纯,所以应该是效率更高(更容易建索引,或者优化)。而多表连接的问题,可以采用视图的方式解决。就是在你的课程模块中,单独写一个视图来查询课程关系。
希望对您有帮助。