Xit*_*d13 11 mysql sql optimization performance database-design
我刚刚开始为我的网站创建一个数据库,所以我正在重新阅读,Database Systems - Design, Implementation and Management (9th Edition)
但我注意到书中描述的没有一步一步的过程来创建一个组织良好和规范化的数据库.这本书似乎有点到处都是,尽管规范化过程都在一个地方,但导致它的步骤却没有.
我认为在一个列表中包含所有步骤是非常有用的,但我无法在网上或其他任何地方找到类似的内容.我意识到回答所有步骤的回答者将是一个非常广泛的步骤,但我将非常感谢任何我可以得到的这个主题; 包括规范化前的指令顺序和建议链接.
虽然我对这个过程半熟悉,但我花了很长时间(大约1年)来设计任何数据库,所以我想详细描述所有内容.
我特别感兴趣的是:
我想使用ER或EER(扩展实体关系模型),我想知道
(我已经熟悉了规范化过程,但答案也可以包含有关它的提示)
还需要帮助:
任何其他建议将不胜感激.
我重新阅读了这本书和一些在线文章,并创建了一个简短的步骤列表,以便设计一个像样的数据库(当然,您需要首先了解数据库设计的基础知识)下面更详细地描述了步骤:
\n\n(书中描述了很多步骤:Database Systems - Design, Implementation and Management (9th Edition)
这也是页码所指的内容,但我将尝试在这里尽可能多地描述,并将在接下来的几天内编辑此答案以使其更加完整)
*如果您使用工作台并在那里设计 ER 模型,则可以跳过此步骤。
\n\n
1.详细描述工作公司。如果您正在创建个人项目,请详细描述它如果您正在与公司合作,请索要描述其公司的文件,并采访员工以获取信息(采访可能会产生不一致的信息,请务必与主管核实哪些信息对设计更重要) )\n
2.查看收集到的信息并开始从中生成规则,确保填补您知识中的任何信息空白。在继续之前与公司主管确认。\n
3.从业务规则中识别主要实体和关系。请记住,在设计过程中,数据库设计者不仅仅依靠访谈来帮助定义实体、属性和关系。通过检查组织在日常运营中使用的业务表单和报告,可以收集数量惊人的信息。(第 123 页)
4.如果数据库很复杂,您可以将 ERD 设计分解为以下子步骤\n
i) 创建外部模型(第 46 页)\n
ii) 组合外部模型以形成概念模型(第 48 页)
Follow the following recursive steps for the design (or for each substep) \n I. Develop the initial ERD.\n II. Identify the attributes and primary keys that adequately describe the entities.\n III. Revise and review the ERD.\n IV. Repeat steps until satisfactory output\n\nYou may also use entity clustering to further simplify your design process.\n
Run Code Online (Sandbox Code Playgroud)\n\n通过ERD描述数据库:\n使用实线连接弱实体(弱实体是指那些没有父实体就不能存在并且其PK中包含父实体PK的实体)。\n使用虚线连接强实体(强实体是那些可以独立存在的实体)任何其他实体)
\n\n
5.检查您的名字是否遵循命名约定。我曾经在这里提出过命名约定的建议,但人们并不真正喜欢它们。我建议遵循您自己的标准或在线查找一些命名约定。如果您发现一些非常有用的命名约定,请发表评论。
6. \n逻辑设计通常涉及将 ER 模型转换为一组关系(表)、列和约束定义。
\n\n使用以下步骤将 ER 转换为逻辑模型:
\n\n7.规范化逻辑模型。您还可以对逻辑模型进行非规范化以获得一些所需的特性。(比如改进的性能)
\n\n8.
\n\n优化属性原子性 -\n通常注意原子性要求是一个很好的做法。原子属性是无法进一步细分的属性。这样的属性被称为显示原子性。通过提高原子性程度,您还可以获得查询灵活性。
根据数据粒度的需要优化主键 - 粒度是指表\xe2\x80\x99s 行中存储的值所表示的详细级别。如前所述,以最低粒度级别存储的数据被称为原子数据。例如,假设 ASSIGN_HOURS 属性表示给定员工在给定项目上的工作时间。然而,这些值是否以最低粒度级别记录?换句话说,ASSIGN_HOURS 表示每小时总计、每日总计、每周总计、每月总计还是每年总计?显然,ASSIGN_HOURS 需要更仔细的定义。在这种情况下,相关问题如下:您想要在什么时间范围\xe2\x80\x94小时、天、周、月等\xe2\x80\x94上记录 ASSIGN_HOURS 数据?\n例如,假设 EMP_NUM 和 PROJ_NUM 的组合是 ASSIGNMENT 表中可接受的(复合)主键。该主键仅用于表示员工自项目启动以来\n在该项目上工作的总小时数。使用代理主键(例如 ASSIGN_NUM)可提供较低的粒度\n并产生更大的灵活性。例如,假设将 EMP_NUM 和 PROJ_NUM 组合用作\n主键,然后员工在 ASSIGNMENT 表中创建了两个 \xe2\x80\x9choursworking\xe2\x80\x9d 条目。该操作违反了\n实体完整性要求。即使您将 ASSIGN_DATE 添加为复合 PK 的一部分,如果任何员工在同一天为同一项目创建两个或多个条目,仍然会生成实体完整性违规。(该员工可能在早上工作了几个小时,然后在当天晚些时候再次处理该项目。)\n当使用 ASSIGN_NUM 作为主键时,相同的数据输入不会产生任何问题。
尝试回答以下问题:“谁将被允许使用这些表以及哪些用户可以使用表的哪些部分?” ETC。
请随时在下面的评论中留下建议或更好的描述链接,我会将其添加到我的答案中
\n