跳到主要内容

5.2 关系建模与 SQL 基础

数据库建模决定数据是否可靠、查询是否高效、后续需求是否容易扩展。即使使用 EF Core,也必须理解关系模型和 SQL 基础。

学习目标

  • 能把业务对象转换为表结构。
  • 能设计主键、外键和基础索引。
  • 能编写常见 SELECTINSERTUPDATEDELETE
  • 能理解一对多、多对多和可选关系。

应用场景

  • 任务属于某个用户。
  • 任务可以有多个标签。
  • 用户可以筛选未完成、逾期或指定标签的任务。
  • 删除用户时需要考虑任务数据如何处理。

核心概念

概念说明
主键唯一标识一行数据
外键表示两张表之间的引用关系
索引提升查询速度,但会增加写入成本
约束在数据库层保证数据合法性

案例:Todo 表设计

CREATE TABLE Users (
Id INT IDENTITY PRIMARY KEY,
Email NVARCHAR(256) NOT NULL UNIQUE,
DisplayName NVARCHAR(100) NOT NULL
);

CREATE TABLE Todos (
Id INT IDENTITY PRIMARY KEY,
UserId INT NOT NULL,
Title NVARCHAR(120) NOT NULL,
Description NVARCHAR(500) NULL,
IsCompleted BIT NOT NULL DEFAULT 0,
DueDate DATETIMEOFFSET NULL,
CreatedAt DATETIMEOFFSET NOT NULL DEFAULT SYSDATETIMEOFFSET(),
CONSTRAINT FK_Todos_Users FOREIGN KEY (UserId) REFERENCES Users(Id)
);

CREATE INDEX IX_Todos_UserId_IsCompleted ON Todos(UserId, IsCompleted);

示例:基础查询

SELECT Id, Title, DueDate
FROM Todos
WHERE UserId = @UserId AND IsCompleted = 0
ORDER BY CreatedAt DESC;
UPDATE Todos
SET IsCompleted = 1
WHERE Id = @TodoId AND UserId = @UserId;

重点难点

  • 表结构要表达业务规则,不能只为了 ORM 方便。
  • 外键能防止孤儿数据,但删除策略必须提前设计。
  • 索引要服务真实查询条件,不是越多越好。
  • 字符串长度、是否允许空、唯一性都应尽量在数据库层约束。

常见误区

误区推荐做法
所有字段都允许为空按业务规则设置 NOT NULL
只依赖应用层校验关键规则同时加数据库约束
每个字段都加索引按查询模式设计组合索引

练习

  • 为 Todo 增加 Tags 表和 TodoTags 关联表。
  • 写 SQL 查询“某用户所有未完成且已逾期任务”。
  • 为上面的查询设计一个索引,并说明原因。