C# SQL数据库:通过Tim Corey的课程深入探讨
在 C# 应用程序开发的世界中,与 SQL 数据库协作是您可以学习到的最重要的技能之一。 在他的视频《C# 应用程序从头到尾课 08 – SQL 数据库设计》中,Tim Corey 讲解了设计关系数据库、创建表、定义关系以及编写存储过程的过程。
在本文中,我们将深入研究 Tim 的课程,并准确解释他所展示的想法。 如果您想更好地理解 C# 应用程序如何连接到 SQL Server 以及如何正确构建您的数据库,Tim 的视频提供了一个很好的指南。
数据库设计简介
在 1:00 时,Tim 开始提醒观众他们将在包中收到所有脚本和文件,包括数据库脚本。他强调目标不是在一节课中成为完整的 SQL Server 专家,而是理解设计以及如何考虑结构化数据。 随后 Tim 直接进入数据库图。
理解数据库图
在 1:52 时,Tim 强调了团队成员表,并解释说它不直接存储一个人的名字或姓氏。 相反,它存储一个链接回 People 表的人员 ID。 这是一个在关系数据库中的一对多关系的例子,一个人可以属于多个团队。
Tim 给出了一个实际的例子:如果多个比赛同时举行,一个人可能是多个团队的成员。 这避免了数据重复,并展示了如何使用主键帮助有效查询数据。 Tim 强调重复数据有害,因为它导致冲突信息,例如不一致的电子邮件地址。
他解释设计方法是使用 ID 而不是存储完整的重复数据。 这是良好 SQL Server 数据库设计的基础。
避免重复列
在 4:48 时,Tim 讨论了为什么应该避免将多个电子邮件地址存储在像 Email2 或 Email3 这样的单独列中。相反,他建议创建一个单独的电子邮件地址表,其中包括人员 ID 和电子邮件地址列。 这样一个人可以有多个电子邮件地址,而不会复杂化 People 表。
Tim 解释数据库设计是简单性和灵活性之间的平衡。 在本教程中,他决定只存储一个电子邮件和一个电话号码,保持设计清晰和实用。
在 SQL Server Management Studio 中创建数据库
在 6:44 时,Tim 切换到 SQL Server Management Studio,并解释他正在使用免费的 SQL Server 2016 开发者版,功能与企业版相同。 他指出它不能在生产中使用,但对于本地机器上的开发非常理想。
Tim 解释了创建 SQL Server 数据库的两种方式:通过 SSMS 对话框或使用 SQL 查询。 他更喜欢查询方法,因为它更快。 他使用的命令是:
创建数据库 tournaments;他解释说分号很重要,应该在每条 SQL 语句的末尾使用。 在创建数据库后,Tim 展示如何刷新 SSMS 窗口以查看新数据库出现。
查看表和表设计
在 12:06 时,Tim 提到他已经通过脚本创建了所有表。然后他演示如何在 SSMS 中打开表设计器。 Tim 解释 SQL 脚本对 C# 开发者可能具有威慑力,而设计器帮助您无需记忆 SQL 语法即可直观编辑表。
Tim 以 Prizes 表为例。 他解释如何设置主键,选择数据类型,并管理空值。 他还指出主键帮助 SQL 优化表存储和检索。 没有主键时,SQL 会创建"堆",这使查询变慢。
自动递增 ID
在 15:36 时,Tim 解释如何通过身份规范使 ID 列自动递增。 他将增量和初始值设为 1。Tim 强调,这为每行提供唯一标识符,并帮助 SQL 高效排序数据。
他指出,这种方法为您提供了一个高度优化的设计,付出最小的努力,这对于希望拥有坚实 SQL Server 数据库而无需复杂调优的 C# 开发者来说是完美的。
了解数据类型
在 18:09 时,Tim 解释了不同的 SQL 字符串类型:varchar、nvarchar 和 nvarchar(max)。 他描述道:
Char:存储字符
Var:可变长度(最多某个数字)
- N:支持国际字符的 Unicode
Tim 解释 nvarchar 使用更多存储空间但支持全球语言,而 varchar 仅适合英文文本。 他还解释 nvarchar(max) 用于非常大的字符串,如 JSON,它可能存储并稍后由应用程序检索。
金钱和浮点数据类型
在 24:00 时,Tim 将 SQL 数据类型与 C# 类型进行比较。他将 money 用于货币值(类似于 C# 中的 decimal),将 float 用于百分比(类似于 double)。 这帮助 C# 开发者匹配 SQL 类型与编程类型。
表关系
在 25:04 时,Tim 演示如何使用外键创建关系。 他打开关系编辑器并解释,主表包含真实的 ID,而外表引用那个 ID。
他还解释级联删除的概念,即当父记录被删除时自动移除相关记录。 Tim 警告 ID 应被视为不可变的,意即一旦创建就不应更改。
创建新表
在 29:30 时,Tim 演示如何使用 SSMS 编辑器创建新表。 他构建一个测试人员表,包含以下列:
姓名
姓氏
电子邮件地址
电话号码
孩子数量
- 创建日期
Tim 展示如何设置默认值,如将孩子数量设为 0,使用 getdate() 设置当前时间。他解释 getutcdate() 更适用于跨时区的应用程序。
编辑表中的数据
在 39:39 时,Tim 展示如何直接在 SSMS 中编辑行。 他添加演示记录,并解释即使失败的插入也会消耗 ID 值。 他建议让 SQL 继续自动增量序列,而不必担心缺失 ID。
基本 SQL 查询
在 44:23 时,Tim 教授基本查询语法:
SELECT * FROM 表
WHERE
LIKE
ORDER BY
- 使用 AS 的列别名
他指出,学习时 SELECT * 是可以的,但在实际应用中您应该具体指定列以提高性能和清晰度。
存储过程
在 50:33 时,Tim 介绍存储过程。 他解释存储过程让您以安全的方式访问数据库逻辑,并防止 SQL 注入攻击。 Tim 偏好存储过程而非直接表访问或视图,因为它们提供更好安全性。
他展示如何创建一个存储过程根据比赛 ID 检索奖品。 他解释了参数、BEGIN 和 END 块,以及 NOCOUNT ON 语句。
执行存储过程
在 58:04 时,Tim 创建一个存储过程根据姓氏获取测试人员,并演示如何使用以下命令执行它:
EXEC dbo.SP_TestPerson_GetByLastName 'Corey'他解释 dbo 模式是默认的,并且 SQL Server 对过程名称不区分大小写。
最后的想法
Tim 在他的视频中总结道:SQL 数据库设计可能看上去很复杂,但核心概念很简单。 他鼓励观众练习和探索,并预告下一节课他将连接数据库到 C# 代码中。

