![MySQL 8 DBA基础教程](https://wfqqreader-1252317822.image.myqcloud.com/cover/469/34752469/b_34752469.jpg)
4.1 数据表的设计理念
数据表是包含数据库中所有数据的数据库对象。数据在表中的组织方式与在电子表格中相似,都是按行和列的格式组织的。其中每一行代表一条唯一的记录,每一列代表记录中的一个字段,如图4-1所示。表中的数据库对象包含列(Columns)、索引(Indexs)和触发器(Triggers),如图4-2所示。
- 列,也称为栏位:对于属性列,创建表时必须指定列的名字和数据类型。
- 索引:根据指定的数据库表列建立起来的顺序,提供了快速访问数据的途径,及可监督表的数据,使其索引指向的列中的数据不重复。
- 触发器:用户定义的事务命令的集合,当对一个表中的数据进行插入、更新或删除操作时,这组命令就会自动执行,可以用来确保数据的完整性和安全性。
![](https://epubservercos.yuewen.com/034E57/18562448901474706/epubprivate/OEBPS/Images/Figure-P107_49981.jpg?sign=1738956879-ASPrRsPDiRbK2FrQLN5NJMMNHprdQBpS-0-e61c48cae08982381d6f3bbb77ab935c)
图4-1 表
![](https://epubservercos.yuewen.com/034E57/18562448901474706/epubprivate/OEBPS/Images/Figure-P108_49995.jpg?sign=1738956879-W9Aj23VPwLprMOveuEvToZvWYuMJza17-0-e816e503d4abc72ec523766a45b94df1)
图4-2 表中的数据库对象
关于数据库的数据表设计,有一些基本的原则和理念。
1.标准化和规范化
关于数据表的设计,有3个范式要遵循。
(1)第一范式(1NF),确保每列保持原子性。
数据库的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项。
(2)第二范式(2NF),确保每列都和主键相关。
要满足第二范式(2NF)必须先满足第一范式(1NF),第二范式要求实体的属性完全依赖主关键字。如果存在不完全依赖,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与元实体之间是一对多的关系。
(3)第三范式(3NF)确保每列都和主键列直接相关,而不是间接相关。
要满足第三范式(3NF)必须先满足第二范式,要求一个关系中不包含已在其他关系中包含的非主关键字信息。
数据的标准化有助于消除数据库中的数据冗余,第三范式通常被认为在性能、扩展性和数据完整性方面达到了最好的平衡,遵守第三范式的数据表只包括其本身基本的属性,当不是它们本身所具有的属性时,就需要进行分解,表和表之间的关系通过外键相连接,有一组表专门存放通过键连接起来的关联数据。
2.数据驱动
采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强了系统的灵活性和扩展性。
例如,如果用户界面要访问外部数据源(文件、XML文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持表里。
还有,如果用户界面执行工作流之类的任务(发送邮件、修改记录、添加用户等),产生的工作流数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,就可以把相当大的责任交给用户,由用户来维护自己的工作流过程。
3.考虑各种变化
在设计数据表的时候,要考虑哪些字段将来可能会发生变更。
4.表和表的关系
数据库里表和表的关系有3种:一对一、一对多、多对多。
一对一,是说我们建立的主表和相关联的表之间是一一对应的,比如新建一张学生基本信息表:t_student,然后新建一个成绩表,里面有一个外键:stuID,学生基本信息表里的字段stuID和成绩表里的stuID就是一一对应的。
一对多,比如新建一个班级表,而每个班级有多个学生,每个学生则对应一个班级,班级对学生就是一对多的关系。
多对多,比如新建一个选课表,可能有许多科目,每个科目有很多学生选,而每个学生又可以选择多个科目,这就是多对多的关系。
其实在设计数据表的时候,我们最多要遵循的就是第三范式,但并不是越满足第三范式就越完美,有时候增加点冗余数据,反而会提高效率,因此在实际的设计过程中要理论结合实际,灵活运用。