关系数据库管理系统 (RDBMS),例如 MySQL、SQL Server、Oracle 和 PostgreSQL,通常将数据存储在表中。这是存储相关数据的好方法。
假设存在三个实体:客户、订单和产品,并且订单包含多个产品。因此有四个表:
- 客户(客户编号,姓名)
- 产品(产品编号、名称、价格)
- 订单(订单号、客户号、日期)
- order_details(order_no, product_no, amount)
我们将提供索引(即搜索树),以便轻松查找客户的订单或订单中的产品。现在假设,我们想知道产品 123 的订单数量:
select count(distinct order_no)
from order_details
where product_no = 123;
DBMS 将快速找到该产品的 order_detail 记录,因为查找索引就像在电话簿中按姓氏搜索(二进制搜索)。然后它只是计数。所以只有很少的记录被读取,整个查询非常快。
现在数组也是如此。比如:
products(product_no, name, price)
customers
(
customer_no,
name,
array of orders
(
order_no,
date,
array of products
(
product_no,
amount
)
)
)
好吧,订单详细信息现在隐藏在一个订单元素中,该元素本身位于一个客户对象中。要获得产品 123 的订单数量,唯一的方法似乎是读取 所有 客户记录,遍历 所有 订单并查看它们是否包含该产品。这可能需要很长时间。此外,如果实体之间的关系没有外键约束,数组可能包含甚至不存在的产品编号。
好吧,可能有一些方法可以对数组数据进行索引,并且可能有一些方法可以保证它们的数据一致性,但是表的关系方法已经证明可以很好地解决这些问题。所以我们会避免使用数组,而是建立与表的关系。这就是关系数据库的用途。
(话虽如此,数组可能会时不时地派上用场,例如,在递归查询中,您是否想记住哪些记录已经被访问过,但这种情况很少见。)