Sql 普通英语中的规范化

Sql 普通英语中的规范化,sql,database,terminology,database-normalization,data-dictionary,Sql,Database,Terminology,Database Normalization,Data Dictionary,我理解数据库规范化的概念,但总是很难用通俗易懂的英语来解释它——尤其是在面试时。我读过这篇文章,但仍然觉得很难向非开发人员解释这个概念。首先想到的是“以不获取重复数据的方式设计数据库” 有人能用通俗易懂的英语解释数据库规范化的概念吗?有什么好的例子来说明第一范式、第二范式和第三范式之间的区别 假设你去面试,对方问:解释规范化的概念,以及如何设计规范化数据库 面试官在寻找什么关键点?好吧,如果我必须向我妻子解释的话,应该是这样的: 其主要思想是避免大数据的重复 让我们看一份名单,上面列出了一些人和

我理解数据库规范化的概念,但总是很难用通俗易懂的英语来解释它——尤其是在面试时。我读过这篇文章,但仍然觉得很难向非开发人员解释这个概念。首先想到的是“以不获取重复数据的方式设计数据库”

有人能用通俗易懂的英语解释数据库规范化的概念吗?有什么好的例子来说明第一范式、第二范式和第三范式之间的区别

假设你去面试,对方问:解释规范化的概念,以及如何设计规范化数据库


面试官在寻找什么关键点?

好吧,如果我必须向我妻子解释的话,应该是这样的:

其主要思想是避免大数据的重复

让我们看一份名单,上面列出了一些人和他们来自的国家。我们没有为每个人保留与“波斯尼亚和黑塞哥维那”一样长的国家名称,而只是保留一个参考国家表的数字。因此,我们持有的不是100个“波斯尼亚和黑塞哥维那”,而是100个45。现在在未来,就像巴尔干国家经常发生的那样,他们分裂成两个国家:波斯尼亚和黑塞哥维那,我只需要在一个地方改变它。嗯,有点

现在,为了解释2NF,我会改变这个例子,让我们假设我们持有每个人访问过的国家的列表。 而不是像这样拿着桌子:

Person   CountryVisited   AnotherInformation   D.O.B.
Faruz    USA              Blah Blah            1/1/2000
Faruz    Canada           Blah Blah            1/1/2000

我会创建三个表,一个表包含国家列表,一个表包含人员列表,另一个表将两者连接起来。这给了我最大的自由,我可以得到更改个人信息或国家信息。这使我能够像规范化所期望的那样“删除重复行”。

我想说,规范化就像记笔记一样,可以说是:

如果你有一张便条说你必须 去买冰激凌而不必担心 正常化之后,您将拥有 另一张纸条上写着你得走了 买冰激凌,每件只有一件 每个口袋

现在,在现实生活中,你永远不会这样做 这是为什么要在数据库中进行呢

对于设计和实现部分,这时您可以回到“行话”并远离外行术语,但我认为您可以简化。首先,你会说你需要做什么,然后当标准化开始时,你会说你会确保以下几点:

  • 表中不能有重复的信息组
  • 任何表都不应包含功能上不依赖于该表主键的数据
  • 对于3NF,我喜欢Bill Kent的观点:每个非键属性都必须提供一个关于键、整个键的事实,除了键什么都不能提供

  • 我认为,如果你也谈到非规范化,以及你不可能总是拥有最佳结构并处于正常形式这一事实,可能会给人留下更深刻的印象。

    这就是我问受访者的问题:

    为什么我们不为应用程序使用一个单个表,而不是使用多个表呢


    答案当然是正常化。如前所述,其目的是通过更新异常来避免冗余

    规范化是一组规则,用于设计通过关系连接的表

    它有助于避免重复条目,减少所需的存储空间,防止重新构造现有表以容纳新数据,提高查询速度

    第一种范式:数据应该以最小的单位分解。表不应包含重复的列组。每行用一个或多个主键标识。 例如,在“自定义”表中有一个名为“Name”的列,应将其拆分为“First Name”和“Last Name”。此外,“Custom”应该有一个名为“CustiomID”的列来标识特定的自定义

    第二种范式:每个非键列都应该与整个主键直接相关。 例如,如果“自定义”表有一个名为“City”的列,则该城市应该有一个单独的表,其中定义了主键和城市名称。在“自定义”表中,将“City”列替换为“CityID”,并将“CityID”作为表中的外键

    第三种范式:每个非键列不应依赖于其他非键列。
    例如,在订单表中,“总计”列取决于“单价”和“数量”,因此应删除“总计”列。

    这不是一个彻底的解释,但标准化的一个目标是允许增长而不尴尬

    例如,如果您有一个
    user
    表,并且每个用户都只有一个电话号码,那么在该表中有一个
    phonenumber
    列就可以了

    但是,如果每个用户都有一个可变数量的电话号码,那么像
    phonenumber1
    phonenumber2
    等列会很尴尬。这有两个原因:

    • 如果您的列上升到
      phonenumber3
      ,并且有人需要添加第四个数字,则必须向表中添加一列
    • 对于电话号码少于3个的所有用户,其行上都有空列

    相反,您希望有一个
    phonenumber
    表,其中每一行都包含一个电话号码和一个外键引用,
    user
    表中它所属的行。不需要空白栏,每个用户都可以根据需要拥有最少或最多的电话号码。

    我已经多次阅读了关于规范化的wiki链接,但我从中找到了更好的规范化概述。这是一个简单易懂的关于规范化到第四范式的解释。读一读

    预览:

    什么是正常化

    规范化是一个过程 奥加
    Friends
    Id | Name | Address
    -------------------------
    1  | John | The Road 1
    2  | Bob  | The Belltower
    
    
    Cats
    Id | Name   | OwnerId 
    ---------------------
    1  | Kitty  | 1
    2  | Edgar  | 2
    3  | Howard | 2
    
    Friends and cats
    Id | Name | Address       | CatName
    -----------------------------------
    1  | John | The Road 1    | Kitty     
    2  | Bob  | The Belltower | Edgar  
    3  | Bob  | The Belltower | Howard 
    
    (Table1)
    tblEmployees
    * EmployeeID
    First
    Last
    (Other Fields)….
    Project1
    Project2
    Project3
    Etc.
    **********************************
    (Table2)
    tblProjects
    * ProjectNum
    ProjectName
    StartDate
    EndDate
    …..