【问题标题】:Steps to design a well organized and normalized Relational Database设计组织良好和规范化的关系数据库的步骤
【发布时间】:2012-05-30 16:10:06
【问题描述】:

我刚开始为我的网站创建一个数据库,所以我正在重新阅读Database Systems - Design, Implementation and Management (9th Edition)但我注意到书中没有描述创建一个组织良好和规范化的数据库的一步一步的过程。这本书似乎有点到处都是,虽然规范化过程都在一个地方,但导致它的步骤却不是。

我认为将所有步骤放在一个列表中非常有用,但我在网上或其他任何地方都找不到类似的东西。我意识到解释所有步骤的回答者将是一个相当广泛的步骤,但我能在这个主题上得到的任何东西都将不胜感激;包括规范化前的指令顺序和建议链接。

虽然我对这个过程有点熟悉,但我在设计任何数据库时都休息了很长时间(大约 1 年),所以我希望对所有内容进行详细描述。

我特别感兴趣:

  • 什么是开始为数据库建模的好方法(或如何列出业务规则以免混淆)

我想使用 ER 或 EER(扩展实体关系模型),我想知道

  • 如何使用 EER(不相交和重叠)正确地为子类型和超类型建模(以及为它写下业务规则,以便您知道它是一个子类型(如果有任何常用的方法))

(我已经熟悉规范化过程,但答案也可以包括有关它的提示)

仍然需要帮助:

  • 编写业务规则(包括 EER 中子类型和超类型的业务规则)
  • 如何在 EER 中正确使用子类型和超类型(如何对其建模)

任何其他建议将不胜感激。

【问题讨论】:

标签: mysql sql performance database-design optimization


【解决方案1】:

设计任何数据库都有六个主要步骤: 一、需求分析 2. 概念设计 3. 逻辑设计 4. 架构细化 5. 物理设计 6. 应用程序和安全设计。

【讨论】:

    【解决方案2】:

    我重读了这本书和网上的一些文章,并创建了一个简短的步骤列表,以便设计一个像样的数据库(当然你需要先了解数据库设计的基础知识)步骤如下更详细描述:

    (书中描述了很多步骤:Database Systems - Design, Implementation and Management (9th Edition),这也是页码所指的内容,但我会在这里尽可能多地描述,并将在接下来的几天内编辑这个答案以实现更完整)

    1. 详细说明组织的运营描述。
    2. 根据操作描述识别业务规则。
    3. 从业务规则中识别主要实体和关系。
    4. 将实体/关系转换为 EER 模型
    5. 检查命名约定
    6. 将 ERR 模型映射到逻辑模型(第 400 页)*
    7. 规范化逻辑模型(第 179 页)
    8. 改进数据库设计(第 187 页)
    9. 验证逻辑模型完整性约束(第 402 页)(如长度等)
    10. 根据用户需求验证逻辑模型
    11. 将表转换为 mySQL 代码(在工作台中使用导出函数将 EER 转换为 SQL 文件,然后转换为 mySQL)

    *如果您使用工作台和您在那里设计的 ER 模型的工作,您可以跳过此步骤。


    1.
    详细描述运作中的公司。如果您正在创建个人项目,请详细描述它如果您正在与公司合作,要求提供描述其公司的文件以及与员工面谈以获取信息(面谈可能会产生不一致的信息,请务必与主管核实哪些信息对设计更重要)
    2.
    查看收集到的信息并开始从中生成规则,确保填补您知识中的任何信息空白。在继续之前与公司的主管确认。
    3.
    从业务规则中识别主要实体和关系。请记住,在设计过程中,数据库设计人员不仅仅依靠访谈来帮助定义实体、属性和关系。通过检查组织在日常运营中使用的业务表格和报告,可以收集到数量惊人的信息。 (第 123 页)


    4.
    如果数据库很复杂,您可以将 ERD 设计分解为以下子步骤
    i) 创建外部模型(第 46 页)
    ii) 结合外部模型形成概念模型(第 48 页)

    Follow the following recursive steps for the design (or for each substep) 
        I.   Develop the initial ERD.
        II.  Identify the attributes and primary keys that adequately describe the entities.
        III. Revise and review the ERD.
        IV.  Repeat steps until satisfactory output
    
    You may also use entity clustering to further simplify your design process.
    

    通过 ERD 描述数据库: 使用实线连接弱实体(弱实体是那些没有父实体就不能存在并且在其PK中包含父PK的实体)。 使用虚线连接强实体(强实体是可以独立于任何其他实体存在的实体)


    5.
    检查您的名称是否符合您的命名约定。我曾经在这里对命名约定提出建议,但人们并不真正喜欢它们。我建议遵循您自己的标准或在线查找一些命名约定。如果您发现一些非常有用的命名约定,请发表评论。

    6. 逻辑设计通常涉及将 ER 模型转换为一组关系(表)、列和约束定义。

    使用以下步骤将 ER 转换为逻辑模型:

    1. 映射强实体(不需要其他实体存在的实体)
    2. 映射超类型/子类型关系
    3. 映射弱实体
    4. 映射二元关系
    5. 映射更高程度的关系

    7. 标准化逻辑模型。您还可以对逻辑模型进行非规范化以获得一些所需的特性。 (比如提高性能)

    8.

    1. 优化属性原子性 - 注意原子性要求通常是一种很好的做法。原子属性是不能 进一步细分。据说这样的属性显示了原子性。通过提高原子性程度,您还可以获得查询的灵活性。

    2. 根据数据粒度的要求细化主键 - 粒度是指存储在表行中的值所代表的详细程度。数据存储在最低 如前所述,粒度级别被称为原子数据。例如,假设 ASSIGN_HOURS 属性表示给定员工在给定项目上的工作时间。然而,是 那些以最低粒度记录的值?换句话说,ASSIGN_HOURS 是否代表每小时 总计、每日总计、每周总计、每月总计或每年总计?显然,ASSIGN_HOURS 需要更仔细的定义。在这种情况下,相关问题如下:在什么时间范围内——小时、天、周、月和 以此类推——你想记录 ASSIGN_HOURS 数据吗? 例如,假设 EMP_NUM 和 PROJ_NUM 的组合是可接受的(复合)主键 在 ASSIGNMENT 表中。该主键仅用于表示员工的总小时数 从一开始就从事一个项目。使用诸如 ASSIGN_NUM 之类的代理主键可提供较低的粒度 并产生更大的灵活性。例如,假设将 EMP_NUM 和 PROJ_NUM 组合用作 主键,然后员工在 ASSIGNMENT 表中输入两个“工作时间”条目。该行为违反 实体完整性要求。即使您将 ASSIGN_DATE 添加为复合 PK 的一部分,实体完整性 如果任何员工在同一天为同一个项目输入两个或多个条目,仍然会产生违规。 (这 员工可能在早上工作了几个小时,然后在当天晚些时候再次工作。) 当 ASSIGN_NUM 用作主键时,相同的数据输入不会产生任何问题。

    3. 尝试回答以下问题:“谁将被允许使用这些表格以及表格的哪些部分可供哪些用户使用?”等。

    请随时在下面的 cmets 中留下更好描述的建议或链接,我会将其添加到我的答案中

    【讨论】:

    • 在命名约定中我没有看到你提到,不要使用数据库本身将使用的关键字或空格。如果一个字段在多个表中(例如 PK/FK),它应该具有相同的名称。
    • 在列名中包含表名的约定是我不同意的。这只是额外的无用工作和更长的难以阅读的字段名,不会为您提供任何您还没有的信息。我见过成千上万的数据库,但没有一个使用这种约定。如果您编写查询,则无论如何都可以在查询中为它们加上表名(或别名)。
    • 很多有用的点,少一些。我不同意您在此处列出的许多命名“约定”。为 boolean 和 date 列添加前缀是一个品味和上下文问题。如果有疑问,请不要这样做 - 只会导致更长的名称。我建议对主键和外键使用相同的名称,例如tbl_id。除了独特和信息丰富之外,您还可以 JOIN 以这种方式使用 USING 子句。永远不会在列名中使用表首字母缩写词。尝试以唯一的方式命名重要的列,而不会产生无用的噪音。等等。
    【解决方案3】:

    您问题的一个方面涉及在 SQL 表中表示子类-超类关系。 Martin Fowler 讨论了三种设计方法,其中我最喜欢的是Class Table Inheritance。棘手的部分是安排 Id 字段从超类传播到子类。完成此操作后,您通常想要执行的连接将是流畅、简单且快速的。

    【讨论】:

      【解决方案4】:

      我会向你推荐这个关于 E/R 建模的视频(大约 9 个)

      http://www.youtube.com/watch?v=q1GaaGHHAqM

      编辑:

      “这个模型的图表必须有多广泛?它们必须包括所有实体和属性吗?”

      是的,实际上你有 ER 建模和扩展 ER 建模,

      这个想法是进行扩展 ER 建模,因为您不仅可以指定实体,还可以指定 PK 和 FK 以及基数。看看这个link(查看图形和两种模型之间的区别)。

      有两种建模方式,一种是真实场景,另一种是DB的真实结构,I.E:

      当您创建 E-ER 建模时,您甚至可以为所有实体创建关系和基数,但是当您要创建数据库时,不必创建基数为 1:N 的关系(基数为 N 的表创建一个FK from table with card.1,并且您不需要在数据库中创建关系表)或者当您具有 1:1 基数时,您知道您的一个实体可以吸收另一个实体。

      看这个Graphic,只创建了 N:M 个关系实体(当你看到 2 个或更多 FK 时,这是一个关系表)

      但请记住,这些只是“规则”,如果您的设计需要,出于性能、安全等考虑,您可以打破它。

      关于工具,有很多,但我推荐workbench,因为你可以用它来连接你的数据库(如果你在mysql中)并创建设计E/R建模,带有属性,他将自动创建关系表 N:M。

      编辑 2:

      在这里我放了一些可以更好地解释的链接,这将需要很多行,并且在这里和我自己更难解释,请查看此链接,如果您有任何问题,请告诉我:

      类型和子类型:

      业务规则(完整性约束)

      【讨论】:

      • 视频看起来很基本,但无论如何都看不下去了。 :)
      • @Xitcod13 如果他们还不够,请告诉我以获取更多信息。
      • 获得更多信息总是好的。我希望看到我提出的所有问题都得到了解答
      • @Xitcod13 我刚刚编辑,如果我解释一下,请告诉我,问候。
      • 非常感谢!它真的有帮助我刚刚下载了程序,我从你的回答中受益匪浅!我希望我能再给它一个赞成票,但可惜我仅限于一个
      猜你喜欢
      • 1970-01-01
      • 2010-09-05
      • 2013-09-01
      • 2011-07-25
      • 2016-03-21
      • 2014-12-02
      • 2011-11-20
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多