Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 数据库规范化_Database Design_Database Normalization - Fatal编程技术网

Database design 数据库规范化

Database design 数据库规范化,database-design,database-normalization,Database Design,Database Normalization,我有一张桌子。我如何将其正常化 在我们开始之前,我会先提到每个步骤的规则。为什么会这样?因为我不知道你表中的依赖项。因此,提出规则和我对你的数据的假设将澄清我是如何得出最终解决方案的 最后,如果您对答案不满意,那么至少您将失去对规范化工作原理的理解,并且可以自己对只有您最了解的数据进行规范化 数据库设计的自然顺序 从指定实体开始(这些是表格) 指定实体所需的属性(这些是列) 指定实体(表的主键)的唯一属性。如果没有,请自己提供一个(也称为合成主键或代理主键) 最后指定这些实体之间的关系(主键

我有一张桌子。我如何将其正常化


在我们开始之前,我会先提到每个步骤的规则。为什么会这样?因为我不知道你表中的依赖项。因此,提出规则和我对你的数据的假设将澄清我是如何得出最终解决方案的

最后,如果您对答案不满意,那么至少您将失去对规范化工作原理的理解,并且可以自己对只有您最了解的数据进行规范化



数据库设计的自然顺序
  • 从指定实体开始(这些是表格)
  • 指定实体所需的属性(这些是列)
  • 指定实体(表的主键)的唯一属性。如果没有,请自己提供一个(也称为合成主键或代理主键)
  • 最后指定这些实体之间的关系(主键外键关系和1-N、N-N关系等)
  • ---------- 现在,基本的设计规则已经就位,很容易看到您的单个表实际上有四个独立的实体融合在一起。它们是:

    1。员工-谁有身份证和姓名

    2。角色-可以是工程师、技术支持等

    3。部门——可以是软件、硬件、部门(可以用更好的词)、语音等

    4。工资-包含EmpId、变更日期和金额。这是因为员工的工资不同,而且同一员工的工资会随着时间的推移而变化

    所以,我们将把这个表分成上面提到的四个表。在这四个表中,Employee表的主键是id,Role和Department需要合成键(甚至可能是自动递增键),Salary表的主键是{EmpId,DataOfChange}。这将看起来像:

    Table Name    Columns
    Employee      Id, Name, RoleId, DeptId
    Role          RoleId, RoleType
    Department    DeptId, DeptName
    Salary        EmpId, DateOfChange, Amount
    
    Emp_ID | Emp_Name | Salary | Emp_Type_Id | Emp_Skill
    ----------------------------------------------------
    1      | raj      | 90000  | 1           | Department
    2      | ravi     | 50000  | 2           | Software
    3      | shyam    | 70000  | 2           | Hardware
    .
    .
    .
    
    以上所有表格可以有更多项目。我想尝试一下与你已经给出的那张桌子有最小差异的设计。Like Salary表也可以有一个字段,如ReasonOfSalaryChange,它可以有值,如NewEmployment、Promotion等。。。但我们把变化控制在最低限度

    希望到现在一切都好。如果是这样的话,我们继续进行您所要求的实际规范化



    常用规范化 我之所以提到常用规则,是因为老实说,我在实践中从未需要BCNF、第四和第五NF

    规则-

    1NF:只是说明所有列都必须具有原子值。如果列需要多个值,请创建另一个表。你的新桌子通过了那个测试。表列中的所有值都是原子值

    2NF:需要1NF限定,任何非关键字段都应依赖于整个主键。所有非键字段(员工中的姓名、角色中的角色类型、部门中的部门名称、薪资中的金额)都依赖于相应表的主键(Id、RoleId、DeptId和{EmpId、DateOfChange})。因此,表格符合2NF标准

    3NF:需要2NF资格,非关键字段不应依赖于任何其他非关键字段。这意味着除了主键之外,表的列之间不应该有依赖关系。角色、部门和薪资表默认为3NF限定,因为它们只有一个非关键列,并且依赖于主键。Employee表(您可以自己验证)没有依赖于任何其他非关键元素的非关键元素。因此,这些表完全符合当前的3NF条件




    现在只剩下指出RoleId、DeptId和EmpId分别是来自Role、Department和Employee表的外键。这将是我向您提交的最后一次重新设计和规范化的数据库。

    在我们开始之前,我将首先提到每个步骤的规则。为什么会这样?因为我不知道你表中的依赖项。因此,提出规则和我对你的数据的假设将澄清我是如何得出最终解决方案的

    最后,如果您对答案不满意,那么至少您将失去对规范化工作原理的理解,并且可以自己对只有您最了解的数据进行规范化



    数据库设计的自然顺序
  • 从指定实体开始(这些是表格)
  • 指定实体所需的属性(这些是列)
  • 指定实体(表的主键)的唯一属性。如果没有,请自己提供一个(也称为合成主键或代理主键)
  • 最后指定这些实体之间的关系(主键外键关系和1-N、N-N关系等)
  • ---------- 现在,基本的设计规则已经就位,很容易看到您的单个表实际上有四个独立的实体融合在一起。它们是:

    1。员工-谁有身份证和姓名

    2。角色-可以是工程师、技术支持等

    3。部门——可以是软件、硬件、部门(可以用更好的词)、语音等

    4。工资-包含EmpId、变更日期和金额。这是因为员工的工资不同,而且同一员工的工资会随着时间的推移而变化

    所以,我们将把这个表分成上面提到的四个表。在这四个表中,Employee表的主键是id,Role和Department需要合成键(甚至可能是自动递增键),Salary表的主键是{EmpId,DataOfChange}。这将看起来像:

    Table Name    Columns
    Employee      Id, Name, RoleId, DeptId
    Role          RoleId, RoleType
    Department    DeptId, DeptName
    Salary        EmpId, DateOfChange, Amount
    
    Emp_ID | Emp_Name | Salary | Emp_Type_Id | Emp_Skill
    ----------------------------------------------------
    1      | raj      | 90000  | 1           | Department
    2      | ravi     | 50000  | 2           | Software
    3      | shyam    | 70000  | 2           | Hardware
    .
    .
    .
    
    上表中的所有内容都可以用h表示