探索关系数据结构

已完成

关系数据库由一组表组成。 一个表可以具有零行(如果表为空)或多行。 每个表都具有固定的列集。 可以使用主键和外键定义表之间的关系,并且可以使用 SQL 访问表中的数据。

除了表之外,典型的关系数据库还包含有助于优化数据组织并提高访问速度的其他结构。 在本单元中,你将更详细地了解其中两种结构:索引和视图。

什么是索引?

索引可帮助在表中搜索数据。 可将表上的索引视为书籍背面的索引。 书籍索引包含一组排序的引用,以及每个引用出现的页。 要找到对书籍中某项的引用时,可通过索引进行查找。 可以使用索引中的页码直接前往书籍中的正确页。 如果没有索引,则可能必须通读整本书籍才能找到所查找的引用。

在数据库中创建索引时,可以指定表中的一列,索引会按排序顺序包含此数据的副本,以及指向在表中对应行的指针。 当用户运行的查询在 WHERE 子句中指定此列时,与必须逐行扫描整个表相比,数据库管理系统可以使用此索引更快地提取数据。 在下面的示例中,查询会检索客户 C1 的所有订单。 Orders 表在 Customer ID 列上具有索引。 数据库管理系统可以查阅索引以快速查找 Orders 表中的所有匹配行。

显示索引示例的示意图,其中的查询检索一位客户的所有订单。

可以对表创建许多索引。 因此,如果还想查找特定产品的所有订单,则对 Orders 表中的 Product ID 列创建另一个索引会十分有用。 但是,索引不是免费的。 索引可能会占用额外的存储空间,并且每次在表中插入、更新或删除数据时,都必须维护该表的索引。 此额外工作可能会减慢插入、更新和删除操作的速度,并产生额外的处理成本。 因此,在确定要创建的索引时,必须在具有提高查询速度的索引与执行其他操作的成本之间实现平衡。 在为只读状态或包含不常修改的数据的表中,更多的索引会提高查询性能。 如果不经常查询表,但是会进行大量插入、更新和删除(如 OLTP 中涉及的表),则对该表创建索引可能会减慢系统速度。

某些关系数据库管理系统还支持聚集索引。 聚集索引按索引键对表进行物理重组。 这种安排可以进一步提高查询性能,因为关系数据库管理系统不必跟踪索引中的引用即可在基础表中查找对应的数据。 下图显示在 Customer ID 列上具有聚集索引的 Orders 表。

显示聚集索引示例的示意图。

在支持聚集索引的数据库管理系统中,一个表只能具有单个聚集索引。

什么是视图?

视图是基于查询的结果集的虚拟表。 在最简单的情况下,可以将视图视为基础表中指定行上的窗口。 例如,可以在 Orders 表上创建一个视图,该视图列出特定产品(在本例中为产品 P1)的订单,如下所示:

CREATE VIEW P1Orders AS
SELECT CustomerID, OrderID, Quantity
FROM Orders
WHERE ProductID = "P1"

可以按照与表大致相同的方式来查询视图和筛选数据。 下面的查询使用视图查找客户 C1 的订单。 此查询仅返回该客户对产品 P1 所下的订单:

SELECT CustomerID, OrderID, Quantity
FROM P1Orders
WHERE CustomerID = "C1"

视图还可以将表联接在一起。 如果经常需要查找客户的详细信息以及他们订购的产品,则可以基于上一个单位所示的联接查询创建视图:

CREATE VIEW CustomersProducts AS
SELECT Customers.CustomerName, Orders.QuantityOrdered, Products.ProductName
FROM Customers JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
JOIN Products
ON Orders.ProductID = Products.ProductID

下面的查询使用此视图查找 QuantityOrdered 超过 100 的所有订单的客户姓名和产品名称:

SELECT CustomerName, ProductName
FROM CustomersProducts
WHERE QuantityOrdered > 100