初学者数据库设计教程

2025-05-28

初学者数据库设计教程

数据库是每个 Web 应用程序的核心。它们的设计(或模式)实际上是所有信息存储、更新和访问方式的蓝图。然而,学习数据库并非易事。市面上有很多关于数据库理论的书籍,内容冗长复杂,但很少有针对初学者的简单解释。

这是一份面向数据库设计初学者的教程。这是我刚开始学习数据库时最希望的入门书。

什么是数据库?

数据库是一种用于存储和检索数据的程序。广义上讲,数据库分为两种类型:关系型和非关系型。

关系数据库更为常见,它由类似于 Excel 电子表格的行列结构表组成。MySQL、PostgreSQL、Microsoft Access、Microsoft SQL 和 Oracle 等热门数据库都是关系型数据库。它们使用 SQL(结构化查询语言),这是一种专门用于管理关系数据库中数据的编程语言。

相比之下,非关系型数据库没有严格的列和行模式。支持者认为它们比关系型数据库“更灵活”,并且越来越多地被 Facebook、谷歌和美国国家安全局等组织用于大数据场景。

本教程将涵盖关系数据库。如果您是数据库新手,那么这里是最简单的入门指南。

表和主键

数据库通常由多个表组成。一个简单的表,我们称之为“customers”,它看起来如下:

客户表

这些列分别是“customer_id”、“username”、“email”、“password”和“birthday”。每一行都称为一条记录。随着用户数量的增长,我们最终可能会添加数百甚至数百万条记录,但定义的列将保持不变。

“id”列就是所谓的主键:一个唯一且非空的数字,用于指向每条记录。关系表中的每条记录/行都有一个主键。

为了理解原因,我们假设用户“william”想要将他的“用户名”改为“bill”。我们如何知道该将哪个“密码”和“生日”与该用户关联?如果没有主键,我们就不知道。

随着时间的推移,表格也会变得越来越复杂。主键为我们提供了一种唯一的方式来识别和管理每条记录。

数据冗余和输入约束

良好数据库设计的一个关键原则是,每个数据项(例如用户名)应该只存储一次,并且只存储在一个位置。这样可以避免维护和更新多个位置,避免出现容易出错的情况。

第二个原则是使用输入约束来提高数据的可靠性。例如,在“电子邮件”列中,我们知道正确的电子邮件记录应该包含“@”符号,因此我们可以说,只有带有“@”符号的数据才能输入到电子邮件列中。在生日列中,我们希望使用日期数据类型,这样就只能接受以数字形式输入的生日。

使用外键链接表

在设计数据库时,关键的决策在于要存储哪些数据以及它们之间存在什么样的关系。目前我们只有一个客户表,但假设我们还需要存储订单表,因为我们正在构建一个电商网站。

我们很容易想到,只需在现有表中添加一列订单信息即可。但订单包含多项我们想要跟踪的信息。例如,我们至少需要了解:

  • order_id(主键),以便我们跟踪每个订单
  • 下订单的日期和时间
  • 下订单的客户

这意味着我们需要为Orders创建一个单独的表。为了将特定订单与特定客户关联起来,我们可以通过customer_id字段使用外键关系来链接这两个表。

订单表

如果我们查看订单表的模式,我们可以看到第一个订单是由客户表中的 customer_id 为 2 的“john”下的。下一个订单,order_id 为 2,是由“william”下的。依此类推。外键让我们能够将多个数据库表链接在一起。

一对多、一对一和多对多关系

外键关系有三种类型。第一种是一对多关系,也就是客户表订单表之间的关系。一个客户可以下多个订单。通过在订单表中使用客户主键作为外键,我们可以跟踪这种情况。

一对一关系的一个例子是跟踪人员和护照的数据库。每个人只能拥有一本护照,反之亦然,因此这两个表具有一对一的关系。

第三种选择称为多对多关系。假设我们有一个数据库,用于跟踪作者和书籍。每个作者可以写多本书,每本书也可以有多个作者。通过外键定义多对多关系,我们可以将这两个表链接在一起。

数据库规范化

设计数据库既是一门艺术,也是一门科学。随着需求的变化,数据库的表和列布局会频繁更新。不幸的是,冗余数据经常会潜入其中,从而导致多个问题:

  • 效率低下——数据库引擎需要为每个查询或更新处理更多数据
  • 臃肿——由于冗余数据导致存储需求增加
  • 错误 - 必须手动输入冗余数据,容易出错

规范化是从数据库表中消除冗余数据的过程的正式术语。规范化有 5 种范式,但大多数数据库设计人员只停留在第 2 级或第 3 级,因为虽然规范化可以减少数据依赖性,但它会增加复杂性,从而降低性能。

后续步骤

现在您已经了解了数据库设计的基础知识,为什么不尝试使用 Django 自己构建一些数据库驱动的网站呢?

文章来源:https://dev.to/wsvincent/database-design-tutorial-for-beginners-33p2
PREV
不要试图太过 DRY,而是采用“写两遍”(WET)编程。不要重复自己(DRY)编程,定义另一种选择 - “写两遍”(WET)编程
NEXT
开发人员采访失误