数据库基本理论知识
1. 数据库
数据库是一个以某种有组织的方式存储的数据集合。最简单的方法是将数据库想象为一个文件柜。这个文件柜是一个存放数据的物理位置,不管数据是什么,也不管数据如何组织。
数据库 (database):保存有组织的数据的容器(通常是一个文件或者一组文件)。
数据库软件应该称为数据库管理系统(DBMS)。数据库是通过DBMS创建和操纵的容器。
2. 表
当我们向文件柜中放资料时,并不是随便将它们扔进某个抽屉,而是在文件柜中创建文件,然后将相关的资料放入特定的文件中。
在数据库领域中,这种文件称为表,表是一种结构化的文件,可以用来存储某种特定类型的数据。
表 (table):某种特定类型数据的结构化清单
这里的关键在于,存储在表中的数据是同一类型的数据或清单。数据库中每个表都有一个名字来标识自己,这个名字是唯一的,没有两个相同名字的表。但是虽然相同数据库中不能两次使用相同的表名,但是在不同的数据库中完全可以使用相同的表名。
表有一些特性,这些特性定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。描述表的这组信息就是所谓的模式(schema),模式可以用来描述数据库中特定的表,也可以用来描述整个数据库(和其中表的关系)。
什么是schema呢?(参考https://www.cnblogs.com/lxz-1263030049/)
数据库中,schema是数据库的组织和结构,schema中包含了schema对象,可以是table、column、data type、view、stored procedures、relationships、primary key、foreign key等。数据库schema可以用一个可视化的图来表示,显示了数据库对象及其相互之间的关系。
以上是架构图的简单示例,显示了三个表以及它们的数据类型、表之间的关系,以及它们的主键和外键。
这是一个更复杂的例子,在这种情况下,模式图分为四个部分:
(1)Customer Data(客户数据):与客户有关的数据,如姓名,地址等
(2)Business(业务):业务所需的数据,例如员工,商店位置,付款细节等
(3)Inventory(库存):所有产品的细节。在这里,产品是电影,所以它包含电影标题,类别,演员等数据。
(4)Views(视图):关于用于评估的数据的特别观点,所以通过这些模式图,我们可以进一步创建一个数据库,实际上,MySQL Workbench允许我们直接从图中生成一个Create Table
脚本,然后我们就可以直接用这个脚本去创建一个数据库,还可以直接将一个数据库转换为一个关系图表。
Schema和Database是否相同
取决于数据库供应商
对schema(模式)产生疑惑的一部分原因是数据库系统倾向于以自己的方式处理模式
(1)MySQL的文档中指出,在物理上,模式与数据库是同义的,所以,模式和数据库是一回事。
(2)但是,Oracle的文档却指出,某些对象可以存储在数据库中,但不能存储在schema中。 因此,模式和数据库不是一回事。
(3)而根据这篇SQL Server技术文章SQLServer technical article,schema是数据库SQL Server内部的一个独立的实体。 所以,他们也不是一回事。
因此,取决于您使用的RDBMS,模式和数据库可能不一样。
MySQL
在MySQL中,CREATE SCHEMA
创建了一个数据库,这是因为CREATE SCHEMA
是CREATE DATABASE
的同义词。 换句话说,你可以使用CREATE SCHEMA
或者CREATE DATABASE
来创建一个数据库。
Oracle Database
在Oracle中,CREATE SCHEMA
语句实际上并不创建一个模式,这是因为已经为在创建用户时,数据库用户就已经创建了一个模式,也就是说在ORACLE中CREATE USER
就创建了一个schema,CREATE SCHEMA
语句允许你将schema同表和视图关联起来,并在这些对象上授权,从而不必在多个事务中发出多个SQL语句。
SQL Server
在SQL Server中,CREATE SCHEMA
将按照名称创建一个模式,与MySQL不同,CREATE SCHEMA
语句创建了一个单独定义到数据库的模式。和ORACLE也不同,CREATE SCHEMA
语句实际创建了一个模式(前面说到这个语句在ORACLE中不创建一个模式),在SQL Server中,一旦创建了模式,就可以往模式中添加用户和对象。
总结
schema这个词可以用在很多不同的环境中,在特定数据库管理系统创建一个schema时,您需要使用DBMS特定定义模式,当你切换到一个新的数据库管理系统时,一定要查看该系统是如何定义schema的。
3. 列和数据类型
表由列组成,列存储表中某部分的信息。
列(column):表中的一个字段,所有表都是由一个或者多个列组成的。
数据库中每个列都有相应的数据类型。数据类型(datatype)定义了列可以存储哪些数据种类。数据类型还帮助正确地分类数据,并且在优化磁盘使用方面起重要的作用。
4. 行
表中的数据是按行存储的,所保存的每个记录存储在自己的行内。有时候行也被称为record。
5. 主键
表中的每一行都应该有一列(或几列)可以唯一标识自己。
主键(primary key):一列(或一组列),其值能够唯一标识表中的每一行。
没有主键,更新或删除表中特定行就会很困难,因为不能保证操作只涉及相关的行。
表中的任何列都可以作为主键,只要它满足以下条件:
- 任意两行都不具有相同的主键值
- 每一行都必须具有一个主键值(主键列不允许NULL)
- 主键列中的值不允许修改或者更新
- 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)
当多个列作为主键时,上述条件必须应用到所有列,所有列值的组合必须是唯一的,但是单个列的值可以不唯一。
6. 什么是SQL
SQL是structured Query Language,一种专门用来与数据库沟通的语言。
SQL有如下优点:
- SQL不是某个特定数据库供应商专有的语言,几乎所有重要的DBMS都支持SQL。
- SQL简单易学
- SQL灵活使用语言元素,可以进行非常复杂的数据库操作
7. 外键
外键是表中的一列,其值必须在另一表的主键中。外键是保证引用完整性的极其重要的部分。我们举个例子来理解。
Orders 表将录入到系统的每个订单作为一行包含其中。顾客信息存储在 Customers 表中。Orders 表中的订单通过顾客 ID 与 Customers 表中的 特定行相关联。顾客 ID 为 Customers 表的主键,每个顾客都有唯一的 ID。订单号为 Orders 表的主键,每个订单都有唯一的订单号。
Orders 表中顾客 ID 列的值不一定是唯一的。如果某个顾客有多个订单, 则有多个行具有相同的顾客 ID(虽然每个订单都有不同的订单号)。同时,Orders 表中顾客 ID 列的合法值为 Customers 表中顾客的 ID。
这就是外键的作用。在这个例子中,在 Orders 的顾客 ID 列上定义了一个外键,因此该列只能接受 Customers 表的主键值。下面是定义这个外键的方法。
其中的表定义使用了 REFERENCES 关键字,它表示 cust_id 中的任何值都必须是 Customers 表的 cust_id 中的值。
相同的工作也可以在ALTER TABLE语句中用CONSTRAINT语法来完成:
如第 6 课所述,除帮助保证引用完整性外,外键还有另一个重要作用。 在定义外键后,DBMS 不允许删除在另一个表中具有关联行的行。例如,不能删除关联订单的顾客。删除该顾客的唯一方法是首先删除相关的订单(这表示还要删除相关的订单项)。由于需要一系列的删除, 因而利用外键可以防止意外删除数据。
有的 DBMS 支持称为级联删除(cascading delete)的特性。如果启用, 该特性在从一个表中删除行时删除所有相关的数据。例如,如果启用级联删除并且从 Customers 表中删除某个顾客,则任何关联的订单行也会被自动删除。