7

有没有人有任何教授关系数据库和 SQL 的好场景?我能找到的所有示例要么是微不足道的,要么具有不太可能的域约束(例如全名是唯一的)。

我特别想找到一些规范化的好例子:不立即适合 3NF 和 BCNF 的表。目前我为每个级别使用不同的问题。

当然,我也喜欢设计糟糕的数据库的好例子,但在掌握基础知识之前,这有点让人分心。


谢谢,一些很好的例子。我已将学生/班级一标记为答案,因为我认为这是迄今为止最好的,但如果有人想贡献更多,请做。

4

9 回答 9

9

我似乎记得学生/班级是经典之作,您也可以将成绩放在那里以使其更复杂一些。

  • 学生可以参加许多课程

  • 班级有很多学生

  • 对于学生参加的每个班级,他们可以有一个成绩

最初,您可以在一个表中执行此操作,然后将其非规范化为三个。

于 2009-02-02T16:41:16.673 回答
6

题外话

教过数据库课程后,我建议在掌握查询的基础知识之前忘记设计。一旦人们了解了如何从数据库中获取数据,人们就会更好地理解规范化的必要性。如果您从规范化和设计开始,您将失去课堂其余部分的大部分学生。设计应该是数据库课程的最后一个模块,但我看过的所有教科书都是从它开始的。

更好的是让他们在学习查询时同时查询好的和坏的数据库设计,然后他们会真正了解在教授设计时糟糕的设计是多么痛苦。

于 2009-02-02T20:03:11.337 回答
2

电子商务/购物车设计很好,因为大多数人都理解这个概念,你可以将它推向许多不同的方向。

你可以做一些简单的事情,比如购物车、购物车项目、用户、订单、订单项目等。

然后你可以更深入地了解 user_addresses、user_emails、items、item_details、item_history 等。

这可以提供很多很好的辩论,因为有很多判断电话。

于 2009-02-02T16:46:25.307 回答
1

我永远不会忘记的一个概念是整个“复数”与“单数”的命名。一位伟大的导师曾经告诉我,您应该将表名设计为复数,将列名设计为单数,并且永远不要为列名创建特定于时间的名称。时间名称示例有 NutsSold1998、NutsSold1999、NutsSold2000 等。切勿在列名称中添加年份、月份或周数或时间等。

表名示例:Employees(非Employee)Parts(非Part)Student(学生)

列名示例:EmployeeID(不是EmployeesID 或EmployeeIDS 等)PartID(不是PartsID 或PartIDS 等)StudentID(不是StudentID 或StudentIDS 等)

并注意 ID、代码、密钥、数字等的正确用法......我总是被教导不要在列的名称中使用“密钥”,除非它是一个实际的表键(主键或外键,但不一定是交替的).. 大多数情况下,附加“ID”会比附加“数字”或“代码”更好,但这完全取决于上下文。

这伴随着时间和设计表格的经验,阅读好的材料,例如《为普通人设计的数据库设计》《为所有人设计的数据建模》。此外,花大量时间寻找好的设计并将它们分开。它绝对是一门手艺,你只会随着时间和练习而变得更好。

于 2009-02-02T20:23:06.307 回答
1

另一个好的模型是 invoice-item 模型,因为“最佳选择”取决于各种因素:

  • 写入与读取操作的数量;
  • 表现;
  • 是否需要报告功能?

看看这个数据模型:

发票

  • ID
  • 日期

发票项目

  • 发票编号
  • 描述
  • 数量

应用程序功能如下:

  • 创建新发票;
  • 每天晚上创建并发送两个报告:(a) 每张发票的总金额,(b) 当天的总金额。

假设您平均每张发票有 5 件物品,每天有 100 张发票,您最终每天都会这样做:

  • 5 x 100 写入 InvoiceItem;
  • 100 写在发票上;
  • 5 x 100 + 100 = 600 从 Invoice 和 InvoiceItem 读取(报告 (a));
  • 5 x 100 + 100 = 600 从 Invoice 和 InvoiceItem 读取(报告 (b));

所以总计 = 1800 次操作/天,假设读取和写入的成本相同。

如果在实体“Invoice”上添加“TotalAmount”属性,情况会有所不同:

  • 5 x 100 写入 InvoiceItem;
  • 100 次写入 Invoice(包括 TotalAmount);
  • 100仅来自发票(报告 (a));
  • 100仅来自发票(报告 (b));

总共有 800 次操作 :)

于 2009-02-18T11:17:48.477 回答
1

这是一个可以追溯到我大学时代的例子——它既被用作数据库设计挑战,也被用作面向对象的设计挑战。

并非所有信息都立即显示出来 - 部分挑战是了解如何调整设计以处理新要求,以及适当的规范化如何使这更容易。

假设您必须为大学/学院的情况设计一个数据库并且想要处理注册。

您已经教授了课程。每门课程每周都有一个标题和一个固定的时间段。

每门课程都有一位讲师介绍课程。

每门课程都有许多学习该课程的学生

每门课程都有一名或多名导师帮助学生学习。您无需跟踪哪些导师帮助了哪些学生。

有些课程有多个固定时间段。

有些课程有多个讲师。

讲师和导师是有报酬的,这意味着我们需要跟踪一些信息以用于税收目的。税务部门不在乎他们的报酬是什么——他们希望我们每人只有一个记录。

在某些课程中,讲师还担任导师,以近距离了解一些学生如何处理材料。

一些导师也是其他课程的讲师。

要成为课程的导师,您必须在更早的时间成为该课程的学生。

并非每个学生都会因通过课程而获得学分——有些学生只是在审核课程而不需要学分。

课程失败的学生可以稍后再次参加该课程。我们需要记录每一次尝试。

于 2009-03-21T21:19:59.253 回答
0

总是有图书馆的例子(图书馆有很多书,每本书都有一个作者和出版商,当你规范化时可以将它们推到单独的表中)

于 2009-02-02T16:48:48.000 回答
0

关于:

我特别想找到一些规范化的好例子:不立即适合 3NF 和 BCNF 的表。

您可以在此处找到规范化的数据库模式示例:http: //www.microsoft.com/sqlserver/2005/en/us/express-starter-schemas.aspx。您可以从头开始构建它们,以向您的学生展示“标准化方式”。特别看一下联系人管理模式。您可以轻松地对模式进行非规范化并将其恢复为 3NF 或更深。

于 2009-02-02T16:54:54.680 回答
0

Itzik Ben Gan 的新书 Microsoft SQL Server 2008:T-SQL Fundamentals 有一个非常基本的示例,您可以看到该示例源自简化的 Northwind 数据库。

Microsoft SQL Server 2008:T-SQL Fundamentals 作者支持页面

于 2009-02-02T17:00:47.213 回答