1.数据表的结构及数据完整性的设计
1、关系型数据库
关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。
SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2 等。
关系型数据库是一种建立在关系模型(数学模型)上的数据库。关系模型是一种建立在关系上的模型,包括以下3个方面:
- 数据结构:二维表,解决数据如何存储。
- 操作指令集合:所有的SQL语句,解决如何处理数据。
- 完整性的约束:表内数据约束(字段与字段),表与表之间的约束(外键)。
关系是一个描述两个集合的元素如何互相联系或意义对应的数学概念。
因此,关系模型是建立在数学基础上的。然而,关系只是一个带有一些特殊属性的表,一个关系模型把数据组织到表中,而且仅在表中。客户、数据库设计者、数据库系统管理员和用户都以同样的方式从表中查看数据。那么表就是关系模型的近义词
2、非关系型数据库
NoSQL(NoSQL = Not Only SQL ),意思是“不仅仅是 SQL”,是非关系型数据库的总称。
除了主流的关系型数据库外的数据库,都认为是非关系型。
主流的 NoSQL 数据库有 Redis、MongBD、Hbase、CouhDB 等。
以实际案例来讲,分析一个教学系统,讲师负责教学,教学生,在教室教学生。
1.找出系统中所存在的实体。讲师表,学生表,班级表。
2.找出实体中应该存在的数据信息。
讲师:姓名、性别、年龄、工龄。
学生:姓名、性别、学号、专业、年龄。
班级表:班级名称、教室编号。
班级表
维护内部、实体与实体之间的联系。实体内部联系:每个学生都有姓名、性别、学号、学科等信息,学生表中的第二行的所有字段都是描述这个学生(内部联系),第二列只放性别(内部约束)。
关系型数据库的特点之一:有的表中对应的某个字段没有值(数据),
但是系统依然要分配相应的空间,那么在没有数据时空 间也是已经分配好的,所以关系型数据库比较浪费空间。
实体与实体(表与表)之间必然要有联系,每个学生肯定属于某个班级,每个班级有一定多个学生(一对多),这样就可以在学生表中增加一个班级字段来指向班级,且必须能够唯一地找到一个班级信息,从而让学生实体与班级实体之间建立关联关系(实体与实体之间的关系),如下表所示
2.数据类型
Mysql的三大数据类型:
1、数值类型
2、字符串类型
3、日期和时间类型
整数类型数据
整数类型又称数值型数据,数值型数据类型主要用来存储数字。不同的数据类型提供不同的取值范围,可以存储的值范围越大,所需的存储空间也会越大。
MySQL 主要提供的整数类型有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,
其属性字段可以添加 AUTO_INCREMENT 自增约束条件。
例如: TINYINT 需要 1 个字节(8bit)来存储,那么 TINYINT 无符号数的最大值为 28-1,即 255;TINYINT 有符号数的最大值为 27-1,即 127。
小数类型数据
MySQL中使用浮点数和定点数来表示小数。浮点类型有单精度浮点数(FLOAT)和双精度浮点数(DOUBLE);
定点类型只有一种,就是 DECIMAL。
浮点类型和定点类型都可以用(M, D)来表示,其中 M 称为精度,表示总共的位数;D 称为标度,表示小数的位数。浮点数类型的取值范围为 M(1~255)和 D(1~30,且不能大于 M-2),分别表示显示宽度和小数位数。M 和 D 在 FLOAT 和DOUBLE 中是可选的,FLOAT 和 DOUBLE 类型将被保存为硬件所支持的最大精度。DECIMAL 的默认 D 值为 0、M 值为 10。
与 float 和 double 不同, decimal 在创建时需要指定两个描述精度的数字, 分别是 precision 和 scale, precision 指整个 decimal
包括整数和⼩数部分⼀共有多少个数字, scale 指 decimal 的⼩数部分包含多少个数字, 例如:123.45 就是⼀个 precision=5,
scale=2 的 decimal. 我们可以在建表时按照这种⽅式定义我们想要的 decim
字符串型数据
字符串类型用来存储字符串数据,还能存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。MySQL中的字符串类型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。
VARCHAR 和 TEXT 类型是变长类型,其存储需求取决于列值的实际长度( L),而不是取决于类型的最大可能尺寸。例如,一个 VARCHAR(10) 列能保存一个最大长度为 10 个字符的字符串,实际的存储需要字符串的长度 L 加上一个字节以记录字符串的长度。对于字符 “abcd”,L 是 4,而存储要求 5 个字节。
①.char 类型是固定长度,varchar类型是可变长度,char类型可能会浪费一些存储空间,varchar类型则是按实际长度存储,比较节省空间
②.char类型数据的检索速度要比varchar类型快。其中,char(n)是固定长度,如char(4)不管有几个字节,都将占用4个字节;
varchar是存入的的“实际字符数+1”个字节(n<=255)或“实际字符数+2”个字节(n>255),所以varchar(4),实际存入3个字符将占用4个字节。对于存储的字符串长度较小,但在速度上有要求时,可以使用char类型,否则使用varchar类型。
③varchar类型可以指定长度n,text类型则不能指定;存储varchar类型数据占用“实际字符+1”个字节(n<=255)或“实际字符数+2”个字节(n>255),存储text类型数据占用“实际字符数+2”个字节,且text创建索引要指定前多少个字符。当报错或查询text字段的值时,不删除尾部空格。
④.enum类型和set类型的值都是以字符串形式出现的,但在数据库中存储的是数值。enum类型只能取单值,他的数据列表是个枚举的集合,它的合法取值列表最允许有65 535个成员,因此,在需要从多个值中选取一个时,可以使用enum类型。如男或女。
时间和日期型数据
MySQL中有多处表示日期的数据类型:YEAR、TIME、DATE、DTAETIME、IMESTAMP。当只记录年信息的时候,可以只使用 YEAR 类型。每一个类型都有合法的取值范围,当指定不合法的值时,系统将“零”值插入数据库中。(时间相关的数据可以加引号’ ',也可以不加)
mysql对于不同种类的日期和时间有很多数据类型,
如year和time。如果只需要存储年份,使用year类型即可;
如果只需要记录时间,使用time类型即可,
如果需要同事存储日期和时间,就可以用datatime或timestamp类型。存储范围较大的日期最好使用datetime类型。
timestamp类型也有datetime类型不具备的属性,默认情况下,当插入一条记录但没有给timestamp类型字段指定具体的值时,
MYSQl会把timestamp字段设置为当前时间。因此,当需要再插入记录的同时插入当前时间,使用timestamp类型更方便。