Mysql中横表与纵表详细解析及应用举例,看完就会用!

横、纵表

定义

横表定义:一个对象的所有属性在一行,列的定义是对象的各个字段

举例:学生成绩表 姓名 Java C语言

​ 张三 100 88

纵表定义:一个对象的所有属性被分配到多行,列的定义是对象的字段和字段的值

举例:学生成绩表 姓名 科目 成绩

​ 张三 Java 100

​ 张三 C语言 88

若采用纵表,为了规范,我们还需保存一张科目表

​ 科目表 名称 描述

​ Java Java

​ C语言 xx

优缺点

横表:

​ 优点:

  1. 查询性能较好:由于所需数据都在同一个表中,查询时只需扫描较少的表,减少了表连接的操作,提高了查询性能。

  2. 理解难度低:横表的设计更符合日常思维,易于理解和维护。

  3. 所占存储空间小:由于一个对象的所有属性都在一行,因此没有冗余数据,所占内存也小。

    缺点:

  4. 数据组织难度高:如果表中的数据结构比较复杂,或者需要经常修改表结构,那么维护和管理起来就比较困难。

  5. 扩展性有限:如果要增加新的数据类型或字段,可能需要在现有表中增加新的列,这可能会影响到现有的查询和数据结构。

纵表:

​ 优点:

​ 1.扩展性高:如果要新增新的数据类型或字段,不需要在加新的列,而是当做值加进去,不用改表结构。

​ 缺点:

​ 1.所占存储空间大:由于一个对象的属性被分到多个行中,以及可能需要新表来记录某些属性,因此容易产生数据冗余,占更多的存储空间。

​ 2.理解难度大

​ 3.查询性能较差:若将一个横表设计成纵表,很可能需要新的表,需要连表查询,降低查询性能。

使用场景

一般情况下,我们使用横表即可满足需求,但如果出现一个表中字段后期需要添加新列,需要扩展的情况,并且内存和性能允许的情况下,建议使用纵表。

应用实践

场景:某教育机构有很多课程,某学生加入了这个教育机构学习课程,在后期学生学习过程中,可能报新的课程,并且该教育机构也可能新添新的课程,现在教育机构需要你将原来的学生教育信息表从横表改为纵表,以方便日后扩展。

原表:student_info

id student_id name apply_java apply_c apply_english apply_math is_valid
1 1 张三 1 1 1 0 1
2 2 李四 1 0 1 0 1
3 3 王五 1 1 0 1 1

改造后的表:student_info student_apply course_info

student_info

id student_id name is_valid
1 1 张三 1
2 2 李四 1
3 3 王五 1

student_apply

id student_id course_id is_apply is_valid
1 1 1 1 1
2 1 2 1 1
3 1 3 1 1
4 1 4 0 1
5 2 1 1 1
6 2 2 0 1
7 2 3 1 1
8 2 4 0 1

course_info

id name des is_valid
1 JAVA 1
2 C 1
3 英语 1
4 数学 1

​ 如上所示,将原来的一张student_info表转化成纵表后拆成了三张表,student_info只记录学生信息,通过student_id作为外键与student_apply表相连,student_apply记录学生报课信息,通过course_id作为外键和course_info表相连。

你可能感兴趣的:(mysql,java,数据库)