Mysql 标准化3NF的分解表

Mysql 标准化3NF的分解表,mysql,sql,normalization,database-normalization,Mysql,Sql,Normalization,Database Normalization,我刚刚开始研究规范化,它完全是在努力计算应该创建多少个表来保存我一直存储在一个表中的数据。以下是我如何分解一张桌子的: Paper ID | Paper Name | Category | Owner 01 | Weekly News | CAT_01 | USER_1 02 | Daily News | CAT_01 | USER_2 03 | The Times | CAT_02 | USER_1 现在,这是正确的标准化,还是应该将其分解

我刚刚开始研究规范化,它完全是在努力计算应该创建多少个表来保存我一直存储在一个表中的数据。以下是我如何分解一张桌子的:

Paper ID | Paper Name  | Category | Owner

01       | Weekly News | CAT_01  | USER_1
02       | Daily News  | CAT_01  | USER_2
03       | The Times   | CAT_02  | USER_1
现在,这是正确的标准化,还是应该将其分解为3个表,如:

Paper ID | Paper Name

01       | Weekly News
02       | Daily News
03       | The Times

Paper ID | Category

01       | CAT_1
02       | CAT_1
03       | CAT_2

Paper ID | Owner

01       | USER_1
02       | USER_2
03       | USER_1
另外,在规范化表中使用空白单元格是否错误?我有一个看起来像:

Author ID | Last Name | First Name | Facebook | Twitter | Website

01        | Griffin   | Brian      | (url)    | (url)   | (url)
02        | Griffin   | Peter      |          | (url)   | 
03        | Griffin   | Meg        | (url)    |         | (url)
04        | Griffin   | Stewie     | (url)    | (url)   | (url)

在实体关系建模方面:

模型中的每个“实体”应表示为表中的一行。“实体”是一个人、地方、事物、概念或事件,可以唯一识别,对业务很重要,我们可以存储有关的信息

“实体”的属性在表中显示为列。在“重复”属性(可以多次出现的属性)的情况下,我们可以创建辅助子表

“规范化”并不要求将每个属性分解成单独的表

用特殊值表示“缺失”或“未知”属性值是完全有效的;我们经常使用特殊的
NULL
值来表示没有值,尽管使用您选择的任何其他值(零长度字符串或字符串,如
'N/a'
)是完全有效的,这取决于需求/用例



在一个完全“规范化”的模型中,每个属性都依赖于“键、整个键,以及除了键以外的任何东西”

就实体关系建模而言:

模型中的每个“实体”应表示为表中的一行。“实体”是一个人、地方、事物、概念或事件,可以唯一识别,对业务很重要,我们可以存储有关的信息

“实体”的属性显示为表中的列。在“重复”属性(可以多次出现的属性)的情况下,我们可以创建辅助子表

“规范化”并不要求将每个属性分解成单独的表

用特殊值表示“缺失”或“未知”属性值是完全有效的;我们经常使用特殊的
NULL
值来表示没有值,尽管使用您选择的任何其他值(零长度字符串或字符串,如
'N/a'
)是完全有效的,这取决于需求/用例


在一个完全“规范化”的模型中,每个属性都依赖于“键、整个键,除了键之外什么都不依赖”

  • 不,把它分成三张桌子就太傻了

  • 在某些情况下,使用空值并不是“错误的”,但我担心的是,实际上,一对多的信息被实现为多个列。如果要添加另一个URL类型,则需要更改表架构以及读取它的所有代码,这是不好的。你应该做一些更像:

  • 如果您想防止一位作者拥有两个Twitter URL,请在作者ID+URL类型上放置唯一索引

  • 不,把它分成三张桌子是愚蠢的

  • 在某些情况下,使用空值并不是“错误的”,但我担心的是,实际上,一对多的信息被实现为多个列。如果要添加另一个URL类型,则需要更改表架构以及读取它的所有代码,这是不好的。你应该做一些更像:


  • 如果你想阻止一个作者拥有两个Twitter URL,请在作者ID+URL类型上设置一个唯一的索引。

    这是应该的

    文件桌

    Paper ID | Paper Name  | Category_Id | Owner_id
    
    01       | Weekly News | CAT_01      | USER_1
    02       | Daily News  | CAT_01      | USER_2
    03       | The Times   | CAT_02      | USER_1
    
    类别表

    Category ID | Category name     
    1           |  Category_a
    
    所有者表

    Owner ID | Owner Name | 
    1        | Owner X
    
    您的基本目标应该是将每个实体移动到自己的表中。每个实体都有自己的属性,这些属性应添加到该特定实体表中

    例如,现在一篇论文属于一个特定的类别。您所需要做的就是从纸张表的categories表中引用categories id。纸张表不需要有类别名称列。可以使用对类别id的引用来收集其余类别数据

    此外,表格中有空白单元格也没有错。我建议不要把事情过分复杂化。虽然规范化一开始听起来确实很深奥,但数据库设计更符合常识。想想看,你可以选择允许用户登录Facebook。你知道有些人会选择这个选项,所以你必须将他们的Facebook id存储在某个地方。另一方面,会有一些人不想通过Facebook登录,因此他们的Facebook_id列将为空

    还有一些要读:

    应该是这样的

    文件桌

    Paper ID | Paper Name  | Category_Id | Owner_id
    
    01       | Weekly News | CAT_01      | USER_1
    02       | Daily News  | CAT_01      | USER_2
    03       | The Times   | CAT_02      | USER_1
    
    类别表

    Category ID | Category name     
    1           |  Category_a
    
    所有者表

    Owner ID | Owner Name | 
    1        | Owner X
    
    您的基本目标应该是将每个实体移动到自己的表中。每个实体都有自己的属性,这些属性应添加到该特定实体表中

    例如,现在一篇论文属于一个特定的类别。您所需要做的就是从纸张表的categories表中引用categories id。纸张表不需要有类别名称列。可以使用对类别id的引用来收集其余类别数据

    此外,表格中有空白单元格也没有错。我建议不要把事情过分复杂化。虽然规范化一开始听起来确实很深奥,但数据库设计更符合常识。想想看,你可以选择允许用户登录Facebook。你知道有些人会选择这个选项,所以你必须将他们的Facebook id存储在某个地方。另一方面,会有一些人不想通过Facebook登录,因此他们的Facebook_id列将为空

    还有一些要读:

    1 假设所有者有三个值firstname,lastnam
    OwnerID | FirstName | LastName | Address
    
     sid <primary key> | Name     | URL
     ------------------------------------
     1                 |Facebook  | <url>
     2                 |Twitter   | <url>
    
     AuthorID<PK> | Last Name | First Name
     -----------------------------------
     01           | Griffin   | Brian
    
     AuthorID | Sid
     --------------
     01       | 1
     02       | 2