开始使用关系型数据库可能会让人感到任务繁重且难以启动。不论您是从 NoSQL 数据库转移过来,还是从未使用过数据库,我将引导您学习如何设计一个关系型数据库,并尝试回答以下问题:

  • 什么是关系型数据库?
  • 数据库中的关系是如何建立的?
  • 确保数据库效率的步骤有哪些?

什么是关系型数据库?

关系型数据库是一种以预定义方式存储数据的方法。所谓预定义,也就是说,在创建数据库时,您需要确定不同实体或数据组之间的关系。关系型数据库非常适合存储需表现现实生活实体关系的结构化数据。

关系型数据库的结构组成:

  • :以行和列形式组织的、代表一个实体的数据。
  • 属性:存储一个实体相关信息的字段。
  • 关系:表之间的关联关系。
  • 索引:用于连接表并进行快速查询。

一个关系型数据库由两个或更多表组成,每个表包含可变数量的行和列。每个表唯一对应其代表的实体。表中的每一列表示与实体相关的某个具体属性,每一行则代表存储在该表中的具体记录。为了更直观显示关系型数据库的运用,我们将设计一个零售商的数据库,用以管理其产品、客户、订单及员工信息。

为一个新零售商设计数据库

这个零售商十分注重客户关系,希望奖励达到消费目标的客户,并在客户完成首次购买一年后赠予特定礼物。此外,该零售商还希望按价格和类别组织商品,以便根据客户年龄提供智能推荐。同时,他们需要追踪业绩最佳的员工,以在年底为销售额最高的员工加薪。

设计数据库模式

数据库模式是我们为数据定义的结构。模式定义了表、表间关系、字段和索引。模式的好坏直接影响数据库性能。通过在模式设计上投入时间,可以在未来维护和扩展数据库时减轻许多麻烦。此外,实体关系图 (ERD) 是一项可帮助设计模式的工具。我们将使用 Lucidchart 创建 ERD。您可以注册一个免费账户来开始。通过这种图表,我们可以可视化实体及其相关关系。

以下是我们在本文中设计数据库模式的主要步骤:

  1. 理解业务需求
  2. 确定实体
  3. 确定实体的属性(字段)
  4. 定义表之间的关系

步骤 1:理解业务需求

设计关系型数据库模式的第一步是深入了解业务需求。这样可以帮助我们明确需要存储哪种信息。例如,如果我们为零售商设计数据库,他们希望提供客户周年纪念礼物,那么我们必须存储客户完成首次购买的日期。

针对客户的需求概要:

  • 存储客户的累计消费金额
  • 存储客户首次购买的周年纪念日期
  • 存储客户的年龄
  • 存储员工的销售额(以金额计)
  • 存储产品,包括类别和价格属性

步骤 2:定义实体(表)

在业务需求明确之后,下一步是确定我们需要存储数据的实体。这些实体也将成为数据库中的表。以零售商为例,我们需要存储以下实体的数据:

  • 客户(customers)
  • 产品(products)
  • 订单(orders)
  • 员工(employees)

如有需要,可以扩展更多实体,例如多个门店(stores)、制造商(manufacturers)等。但在本文设计中,我们仅聚焦于满足虚拟客户需求的上述四个实体。在 ERD 中,每个实体可以用一个矩形表示,矩形顶部是表/实体名称。

步骤 3:定义属性(字段)

接下来是为已识别的实体定义属性或数据字段。一个重要原则是,每个表都应有一个唯一标识属性。这称为主键(Primary key),它用于区分不同记录。例如,如果我们有两个名字相同或出生日期相同的客户,主键可以帮助我们快速标识特定客户。

创建主键的两种常见方式:

  1. 程序生成唯一值(例如:UUID)
  2. 给每条记录自动分配递增的整数值

这些字段的定义可以直接从业务需求获得。例如,业务希望知道谁完成了购买、谁进行了销售以及订单包含哪些产品。在“订单”表中,我们可以看到引用了 customerIDemployeeID 和 productID,这些字段用于记录与对应客户、员工和产品的关联。

步骤 4:定义关系

关系型数据库的核心在于表之间的关系。在关系型数据库中,父表拥有一个唯一的主键,而子表则拥有其自己的主键,同时引入父表的主键作为外键。我们在定义字段时已经间接实现了这一点。例如,customers 表有一个主键 customerID,在 orders 表中,orderID 是主键,而 customerID 被引用为外键,以标记哪个客户下了订单。同样的,orders 表还有一列字段 employeeID 来关联 employees 表,表明是哪位员工完成了销售。

当主键在其他表中出现时,这个字段在那个表中称为外键(Foreign key)。主键和外键之间的关系定义了表之间的联系。

你完成了!

我们已经讨论了设计数据库模式的主要步骤:理解业务需求、定义实体、定义字段以及定义表之间的关系。设计数据库模式可能令人担忧,因为传统关系型数据库中的模式变更可能会导致整个应用瘫痪或数据丢失。借助 PlanetScale 的分支功能,您可以像操作代码一样对模式进行分支。您可以在隔离环境中测试模式变更,并在满意新的模式后,将分支合并到生产主分支中,无需担心停机或数据丢失问题。注册一个 PlanetScale 帐号,开始您的旅程吧。



关系型数据库模式设计入门指南插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2025/05/20/schema-design-101-relational-databases/