代码之家  ›  专栏  ›  技术社区  ›  Mark

教学数据库设计的好例子[关闭]

  •  6
  • Mark  · 技术社区  · 17 年前

    有没有人有教关系数据库和SQL的好方案?我能找到的所有例子要么是琐碎的,要么是不可能的域约束(比如全名是唯一的)。

    我特别想找到一些很好的标准化示例:不适合3nf和bcnf的表。目前,我正在为每个级别使用不同的问题。

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


    谢谢,举几个好例子。我已经把这个学生/一班作为答案,因为我认为这是目前为止最好的答案,但是如果有人想贡献更多,请做。

    9 回复  |  直到 12 年前
        1
  •  9
  •   Jeremy French    17 年前

    我似乎记得学生/班级是一个经典,你也可以把分数放在里面,让它更复杂一点。

    • 学生可以上很多课

    • 班上有很多学生

    • 对于每一个班级,学生都可以获得一个分数。

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

        2
  •  6
  •   HLGEM    17 年前

    偏离主题

    在教授了数据库课程之后,我建议在掌握查询的基础知识之前,不要再考虑设计。一旦人们了解了如何从数据库中获取数据,他们就会更好地理解规范化的需求。如果你从规范化和设计开始,你将失去班上其他学生的大部分。设计应该是数据库课程的最后一个模块,但我所复习过的所有教科书都是从它开始的。

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

        3
  •  2
  •   shsteimer    17 年前

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

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

    然后,您可以更深入地了解用户地址、用户电子邮件、项目、项目详细信息、项目历史记录等。

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

        4
  •  1
  •   Taptronic    17 年前

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

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

    列名示例: EmployeeID(非EmployeeID或EmployeeID等) 部分(非部分或部分等) 学生ID(不是学生ID或学生ID等)

    注意正确使用身份证、代码、钥匙、号码等。我一直被教导不要在列的名称中使用“key”,除非它是一个实际的表键(主键或外键,但不一定是可选的)。大多数情况下,附加“id”比附加“number”或“code”要好,但这都取决于上下文。

    在设计桌子、阅读书籍等优秀材料方面,我们有时间和经验。 Database Design For Mere Mortals Data Modeling for Everyone . 而且,花很多时间去看好的设计并把它们分开。这绝对是一门手艺,你只会随着时间和练习而变得更好。

        5
  •  1
  •   Bevan    17 年前

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

    并不是所有的信息都被一次揭示出来——挑战的一部分在于如何调整设计来处理新的需求,以及适当的规范化如何使这变得更容易。

    假设您必须为大学/学院的情况设计一个数据库,并希望处理入学问题。

    你有 课程 教。每门课程每周都有一个标题和一个固定的时间段。

    每道菜都有 讲师 谁介绍课程。

    每道菜都有很多 学生 学习课程的人。

    每个课程有一个或多个 导师 帮助学生学习的人。你不需要跟踪哪些导师帮助哪些学生。

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

    有些课程有多个讲师。

    讲师和导师都是有报酬的,这意味着我们需要跟踪一些税务方面的信息。税务部门不关心他们的报酬——他们希望我们每个人都有一个单独的记录。

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

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

    要成为一门课程的导师,你必须早点成为这门课程的学生。

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

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

        6
  •  0
  •   Rowland Shaw    17 年前

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

        7
  •  0
  •   MarlonRibunal    17 年前

    重新:

    我特别想找一些 标准化的好例子: 不适合3nf的表格 和BCNF。

    你可以找到 归一化 此处显示数据库架构示例: http://www.microsoft.com/sqlserver/2005/en/us/express-starter-schemas.aspx . 你可以从头开始构建它们,向你的学生展示“标准化的方法”。特别是查看联系人管理模式。您可以轻松地取消模式的规范化,并将其恢复到3nf或更深层。

        8
  •  0
  •   K. Brian Kelley    17 年前

    itzik Ben-gan的新书Microsoft SQL Server 2008:T-SQL Fundamentals有一个非常基本的示例,您可以看到它是从一个简化的Northwind数据库派生而来的。

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

        9
  •  0
  •   Dimitri De Franciscis    17 年前

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

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

    看看这个数据模型:

    发票联

    • 身份证件
    • 日期

    发票项目

    • 发票ID
    • 描述
    • 数量

    应用功能包括:

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

    假设您的每张发票平均有5个项目,每天有100张发票,您最终会这样做,每天:

    • 发票项目上的5 x 100写操作;
    • 发票上写100次;
    • 从发票和发票项目(报告(A))中读取5 x 100+100=600;
    • 从发票和发票项目(报告(b))中读取5 x 100+100=600;

    因此,假设读写成本相同,那么总计为1800次操作/天。

    如果在实体“invoice”上添加“totalamount”属性,情况会稍有不同:

    • 发票项目上的5 x 100写操作;
    • 发票100份(含总金额);
    • 发票100 只有 (报告(a));
    • 发票100 只有 (报告(b));

    总共800个操作:)