在探讨数据库管理系统(DBMS)的演变和类型之前,让先从大脑处理信息的方式说起。比如,当听到“喜欢苹果吗?”这个问题时,不会去思考字母“a”、“p”、“p”、“l”、“e”,而是会联想到与苹果相关的所有信息,通过苹果的形象来回忆。这可能是大脑处理数据的一种方式。当然,这个过程是复杂且高效的。同样地,如果被问到“数据库是什么?”,可能会想到一系列相互关联的表格。但如果这个问题是在1990年代提出的,人们可能只会想到一个单一的大表格,从中检索所有信息。但今天对数据库的定义已经远远超出了这种简单的看法。
这可能是最容易理解的,但目前很少使用。可以将其想象为一个巨大的单一表格。这种类型的数据集在1990年代被广泛使用,当时数据仅用于检索信息。在这些数据库上进行的分析非常原始。
很快,人们意识到这样的表格几乎不可能长期存储。平面文件带来了大量的冗余数据。例如,如果想创建一个包含杂货店所有购买产品以及所有客户和产品信息的单一数据集,将会有每一行都包含所有客户和产品信息。在有重复产品或客户的地方,会有重复的数据。人们想到了将这些存储为不同的表格,并定义一个层次结构来访问所有数据,这被称为层次数据库。
层次数据库非常类似于笔记本电脑上的文件夹结构。每个文件夹可以包含子文件夹,每个子文件夹仍然可以包含更多的子文件夹。最后,在某些文件夹中会存储文件。然而,每个子节点(子文件夹)将有一个单一的父节点(文件夹或子文件夹)。最终可以创建数据集的层次结构:尽管层次数据库可以解决许多问题,但其应用受限于一对一映射的数据结构。例如,如果使用这种数据结构来显示公司中的职位层次结构,它会很好地工作。但如果报告变得更加复杂,一个员工向多个经理汇报,这种结构就会失败。因此,人们想到了可以有不同类型关系的数据库结构。这种类型的结构应该允许一对多映射。这样的表格被称为关系型数据库管理系统(RDBMS)。
以下是一个RDBMS数据结构的例子:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100),
-- 其他客户信息
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
-- 其他订单信息
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
如所见,有多个键可以帮助合并这个数据库中的不同数据集。这种数据存储优化了占用的磁盘空间,同时不牺牲数据细节。这是通常由分析行业使用的数据库。然而,当数据失去结构时,这种数据库就无济于事了。
NoSQL通常被称为“不仅仅是SQL”。当人们意识到非结构化文本包含大量信息,他们无法使用RDBMS挖掘这些信息时,他们开始探索存储这类数据集的方法。今天任何不是RDBMS的都被称为NoSQL。随着社交网络在市场上的重要性增加,这种数据库在行业中变得普遍。以下是一个例子,说明在RDBMS中存储数据将变得非常困难:
{
"user": {
"id": "123",
"name": "John Doe",
"friends": ["456", "789"],
"likes": ["post_1", "post_2"],
"comments": ["comment_1", "comment_2"]
},
"posts": [
{
"id": "post_1",
"author": "123",
"content": "Hello World!",
"comments": ["comment_1"]
},
{
"id": "post_2",
"author": "123",
"content": "Another post!",
"comments": ["comment_2"]
}
],
"comments": [
{
"id": "comment_1",
"author": "456",
"content": "Great post!"
},
{
"id": "comment_2",
"author": "789",
"content": "Interesting!"
}
]
}