PostgreSQL11快速入门(四)-数据库对象基本概念
PostgreSQL11快速入门(四)-数据库对象基本概念
这一节主要讲解数据库相关的基础概念,包括数据库、模式、表、行、列等。
1. 数据库、模式、表、行和列
首先先用一张图来大概了解下 PG 的数据库对象的结构:
这里先给出层级关系定义:
- 一个 PG 服务器实例 可以包含多个 数据库 database。
- 每个 数据库 database 可以包含多个 模式 schema。
- 每个 模式 schema 可以包含多个 表 table(当然也包括其他对象,比如视图、函数等,这里先不展开)。
1.1 数据库 database
定义:数据库是一个按照数据结构来组织、存储和管理数据的仓库。 在 PG 中 , 一个数据库服务器实例可以管理多个数据库 , 每个数据库都是相互独立的,有自己的表、视图、函数等对象。 这里需要搞清楚的是, database 指的是一个数据库实例底下的仓库,不是指的数据库实例本身。
创建数据库的 SQL 语法如下:
CREATE DATABASE database_name;
用途: 通常一个项目或一个应用会使用一个数据库,但是如果项目非常大,或者需要隔离不同的业务线,可能会使用多个数据库。
**特点: **每个数据库都是隔离的,不同数据库之间默认不能直接进行交叉查询( 除非使用特定的扩展如 dblink)。
**举例: ** 假设图书馆是一个数据库实例 ( database instance ),那么数据库 (database) 就类似于图书馆的一个分馆。每个分馆都是独立管理的,有自己的书籍集合和规章制度。
1.2 模式 schema
定义: 模式 (Schema) 是一个命名空间 , 用于组织数据库对象 , 如表、视图、函数等。一个数据库可以包含多个模式 , 而一个模式可以包含多个数据库对象。模式可以用于将数据库对象分组 , 提高可管理性和安全性。
创建模式的 SQL 语法如下:
CREATE SCHEMA schema_name;
用途: 模式用来组织和分隔数据库中的数据,可以根据功能、应用模块或访问权限来组织数据。一个数据库可以包含多个模式。PG 默认每个数据库底下有一个 public 的模式,各个用户都可以访问。
**特点: **模式可以用来控制数据的访问权限,常用于在同一个数据库中实现逻辑上的分组和隔离。
**举例: ** 如果数据库(database) 是图书馆的一个分馆 ,那么模式( schema ) 图书馆内的不同部门或区域(例如,科学、文学、儿童区)。每个区域管理着特定类型的书籍,并且这些区域帮助管理和组织图书馆内的空间。
1.3 表 table
定义: 表是数据库中最基本的对象,用于存储结构化数据。一个表由行 (Row) 和列 (Column) 组成 , 每一列都有一个特定的数据类型。表可以位于某个模式下,也可以位于公共模式(public)下。
创建表的 SQL 语法如下:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
);
用途: 表用来具体存储数据,每个表都属于某个模式,表中的数据按照定义的列结构来组织。
**特点: **每个表都有一个或多个列,每列有特定的数据类型和大小。表可以通过主键、外键等约束来维护数据的完整性。
举例: 数据库表 ( table ) 就是具体的书架,每个书架上放置着具体的书籍,这些书籍按照一定的顺序和分类存放。
1.4 行 row
定义: 行(也称为元组或记录)是表中的一条数据 , 表示一个实体的信息。一行数据包含了表中每一列的值。
插入行的 SQL 语法如下:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
用途: 每一行代表一个单独的数据实体或记录。例如,在一个员工数据库的表中,每一行将代表一个员工的完整记录,包括他们的姓名、部门、职位等。
**特点: **数据库中的每一行可以通过一个唯一标识符(如主键)进行识别,确保每条记录的独立性。
举例: 每一行就像是图书馆的一本书。每本书都是一个单独的实体,包含了描述这本书的所有详细信息(在数据库中,这些详细信息是通过列来定义的)。
1.5 列 column
定义: 列(也称为字段或属性)是表中的一个数据项,用于描述实体的某个属性。每个列都有一个名称和数据类型,列的值在每一行中都有一个对应的值。
**举例: ** 每一列就像是图书馆书籍记录表中的一个属性或特征,例如”书名”、”作者”或”出版年份”。所有的书都会在这些特定的属性下记录相应的信息。
2. 主键、外键和索引
2.1 主键
定义:主键 (Primary Key) 是表中的一列或多列,用于唯一标识表中的每一行数据。主键的值不能为空,也不能重复。一个表只能有一个主键。
定义主键的 SQL 语法如下:
CREATE TABLE table_name (
column1 datatype PRIMARY KEY,
column2 datatype,
...
);
或者:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...,
PRIMARY KEY (column1)
);
用途:
- 唯一标识: 主键的主要用途是唯一标识表中的每一行。这是数据完整性的关键部分。同时可以通过主键快速找到一行数据。
- 关联表: 在数据库中,主键也用来与其他表的外键建立关系,进行数据关联查询。
举例: 假设每本书在图书馆中都有一个独一无二的编号,就像每本书的身份证。这个编号是书籍的主键。无论图书馆有多少本相同的书,每本书的编号都是唯一的,确保你能准确找到特定的一本书。在数据库中,主键的作用就是这样,它保证每条记录都可以被唯一标识和快速找到。
2.2 外键
定义:外键(Foreign Key)是一个表中的一列或多列,用于引用另一个表的主键,建立表之间的关联关系。外键的值必须在被引用的表的主键中存在,或者为空。
定义外键的 SQL 语法如下:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...,
FOREIGN KEY (column1) REFERENCES other_table (other_column)
);
用途: 外键约束确保对应的主键数据存在,防止出现悬挂数据。 在一些传统项目中用的比较多,最近几年流行在应用层进行外键关联以及数据约束,所以慢慢的外键就会用的越来越少。
举例: 想象一下,学校的图书馆一般都会刷校园卡去进入图书馆。每当学生借书时,借阅记录里不仅会记录书籍的编号,还会记录学生卡卡号。这个学生卡卡号就类似于数据库中的外键,它连接了学生信息表和借阅记录表。通过外键,你可以轻松查到哪个学生借了哪本书,确保借阅记录的准确性和完整性。
2.3 索引
**定义 **:索引 (Index) 是一种数据库对象,用于提高表中数据的查询速度。索引可以在表的一列或多列上创建,提供了一种快速访问数据的方法。PG 支持多种类型的索引 , 如 B-tree、Hash、GiST 等。
创建索引的 SQL 语法如下:
CREATE INDEX index_name ON table_name (column1, column2, ...);
用途:
- 提高查询效率:索引使数据库查询操作更快,尤其是在大数据量的表中。
- 排序和分组优化:索引还可以加快排序和分组查询的处理速度。
举例: 如果图书馆的书籍是随机摆放的,找一本特定的书可能需要花费大量时间。图书馆通常会根据书名、作者或类别等来对书籍进行排序和编排,这样你就能快速找到你需要的书。在数据库中,索引的作用就像图书馆的排列顺序,它帮助你快速通过特定的信息(如作者名、书名)找到数据记录,显著提升查询效率。
3. 参考链接
- PostgreSQL 官方文档 - Table Basics: https://www.postgresql.org/docs/11/ddl-basics.html
- PostgreSQL 官方文档 - 约束: https://www.postgresql.org/docs/11/ddl-constraints.html
- PostgreSQL 官方文档 - 索引: https://www.postgresql.org/docs/11/indexes.html