教数据库设计的好例子

时间:2009-02-02 16:33:41

标签: database-design normalization scenarios

有没有人有任何关于教授关系数据库和SQL的好方案?我能找到的所有例子都是微不足道的或者有不可能的域约束(比如全名是唯一的)。

我特别想找到一些标准化的好例子:不能立即适应3NF和BCNF的表格。目前我正在为每个级别使用不同的问题。

当然,我也喜欢设计糟糕的数据库的好例子,但是在掌握了基础知识之前,它会有点分散注意力。


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

9 个答案:

答案 0 :(得分:9)

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

  • 学生可以参加很多课程

  • 课程有很多学生

  • 对于每个班级,学生都可以参加

最初,您可以在一个表中执行此操作,并将其归一化为三个。

答案 1 :(得分:6)

关闭主题

在教过数据库课程后,我建议忘记设计,直到掌握了查询的基础知识。一旦人们理解了如何从数据库中获取数据,人们就会更加理解对规范化的需求。如果你从规范化和设计开始,你将失去大部分学生在课堂上的其余部分。设计应该是数据库课程的最后一个模块,但我所评论的所有教科书都是从它开始的。

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

答案 2 :(得分:2)

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

您可以执行简单的操作,例如cart,cart_items,用户,订单,order_items等。

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

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

答案 3 :(得分:1)

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

表名示例: 员工(非员工) 零件(不是零件) 学生(学生)

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

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

这需要时间和经验来设计表格,阅读好书材料,如书籍Database Design For Mere MortalsData Modeling for Everyone。此外,花费大量时间看好设计并将它们分开。它绝对是一种工艺,你只会随着时间和练习而变得更好。

答案 4 :(得分:1)

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

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

假设您必须为大学/大学情况设计数据库并希望处理注册。

您教授了课程。每门课程每周都有一个标题和一个常规时段。

每门课程都有讲师,他们会参加课程。

每门课程都有很多学生来学习该课程。

每个课程都有一个或多个导师,帮助学生完成学习。您无需跟踪哪些辅导员可以帮助哪些学生。

有些课程有多个常规时段。

有些课程有多个讲师。

讲师和导师是有偿的,这意味着我们需要为税务目的跟踪一些信息。税务部门并不关心他们的收入 - 他们希望我们每个人都有一份记录。

在某些课程中,讲师也是一名导师,以便近距离了解一些学生如何处理这些材料。

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

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

并非每个学生都能获得通过该课程的学分 - 有些只是在不需要学分的情况下审核课程。

未通过课程的学生可以稍后再次参加该课程。我们需要保留每次尝试的记录。

答案 5 :(得分:0)

总有图书馆的例子(一个图书馆有很多书,每本书都有一个作者和出版商,可以在你标准化时被推入单独的表中)

答案 6 :(得分:0)

回复:

  

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

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

答案 7 :(得分:0)

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

Microsoft SQL Server 2008: T-SQL Fundamentals author support page

答案 8 :(得分:0)

另一个好的模型是发票项目模型,因为“最佳选择”取决于各种因素:

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

看看这个数据模型:

发票

  • ID
  • 日期

InvoiceItem

  • invoiceID
  • 描述
  • 金额

应用功能是:

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

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

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

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

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

  • 在InvoiceItem上写入5 x 100;
  • 在Invoice上写入100(包括TotalAmount);
  • 来自Invoice
  • 100 (报告(a));
  • 来自Invoice
  • 100 (报告(b));

共有800次操作:)