横、纵表
定义
横表定义:一个对象的所有属性在一行,列的定义是对象的各个字段
举例:学生成绩表 姓名 Java C语言
张三 100 88
纵表定义:一个对象的所有属性被分配到多行,列的定义是对象的字段和字段的值
举例:学生成绩表 姓名 科目 成绩
张三 Java 100
张三 C语言 88
若采用纵表,为了规范,我们还需保存一张科目表
科目表 名称 描述
Java Java
C语言 xx
优缺点
横表:
优点:
-
查询性能较好:由于所需数据都在同一个表中,查询时只需扫描较少的表,减少了表连接的操作,提高了查询性能。
-
理解难度低:横表的设计更符合日常思维,易于理解和维护。
-
所占存储空间小:由于一个对象的所有属性都在一行,因此没有冗余数据,所占内存也小。
缺点:
-
数据组织难度高:如果表中的数据结构比较复杂,或者需要经常修改表结构,那么维护和管理起来就比较困难。
-
扩展性有限:如果要增加新的数据类型或字段,可能需要在现有表中增加新的列,这可能会影响到现有的查询和数据结构。
纵表:
优点:
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表相连。