规范化表格的模式

时间:2013-11-25 09:49:58

标签: sql sql-server normalize

我是SQL的新手,我很难知道什么是好的,坏的,更好的或最好的设计。

我有一个SQL 2008数据库,我和Entity Framework 4.3一起使用。我试图规范化我的数据库。

在我的设计中,我有2个表应用程序和接受应用程序。

AcceptedApplications只是Applications表的扩展,因为您猜对了,AcceptedApplications。这仅包含与被拒绝的申请无关的进一步信息。

Application和AcceptedApplications之间存在外键关系,因此在插入AcceptedApplication之前,应用程序必须存在。

但是,我也在考虑在应用程序表中添加一个字段来表明它是否被接受,例如“IsAccepted'

”。

问题是,这是否必须?作为一个新手,我不一定知道有关Benfits(如果有的话)只是检查ApplicationAccepted中是否存在ID或者将2个表连接起来。在使用方面,我不会仅仅为了分析/报告目的而在实时网站上查询被拒绝的申请。

2 个答案:

答案 0 :(得分:0)

IsAccepted位字段似乎更合理。

但是,如果由于某种原因可能存在另一个Applications表,例如对于正在接受或已被拒绝的应用程序,具有不同的字段,您当前的解决方案似乎更好。

我认为这不太可能,但根据您的实际需要,这可能听起来很有用。

请注意,这两种解决方案均为第3种正常形式。

答案 1 :(得分:0)

很有可能您不需要这两个表格,因为Application表格可以根据您的信息满足您的需求。您要添加到AcceptedApplication表格的字段,即IsAccepted字段可以简单地添加到您的Application表格中。

您的应用程序表可能有这种结构:

表:申请

 ApplicationID, Applicant_Lastname, Applicant_Firstname, ApplyDate, IsAccepted, AcceptedDate

Normalization中的密钥有趣的是primary key。正如EF Codd所说,我将从内存中引用" 每个非密钥(意味着不是主键)必须在密钥上提供一个事实(意味着主键),而不是密钥"

例如,IsAccepted字段实际上是非密钥,在功能上依赖于主键ApplicationID,因此无需为此创建新表。

就我个人而言,我使用助记符设备作为前三种常规形式,即单词 RePeaT (忽略元音)。首先是没有重复组或多值字段,第二个没有对主键的部分依赖,最后没有过渡依赖。

第一范式(1NF):无重复组或多值字段

示例:(学生参加课程

  +-----------------------------------------------
  + CourseTakenID  StudentID    CoursesTaken
  +-----------------------------------------------
  + 1               101          CS100, CS102, CS103
  + 2               102          MS100, CS101

在这种情况下,CoursesTakenMulti-valued字段,违反了1NF

要进行规范化,您可以创建一个名为CourseTaken的单独表(现在我也假设已经存在Course表),例如:

  +-----------------------------------------------
  + CourseTakenID  StudentID    CoursesTaken
  +-----------------------------------------------
  + 1               101          CS100
  + 2               101          CS102
  + 3               101          CS103
  + 4               102          MS100
  + 5               102          CS101

或者如果是重复组,它将如下所示:

  +--------------------------------------------------------------
  + StudentID  StudentLastName   StudentFirstName   CoursesTaken
  +--------------------------------------------------------------
  + 101        Smith             John             CS100
  + 101        Smith             John             CS102
  + 101        Smith             John             CS103
  + 102        Gilmore           Anna             MS100
  + 102        Gilmore           Anna             CS101

为了规范化,它将与上面相同,但是您的Student表只是:

  +-----------------------------------------------
  + StudentID  StudentLastName   StudentFirstName  
  +-----------------------------------------------
  + 101        Smith             John             
  + 102        Gilmore           Anna 

第二范式(2NF):无部分依赖

现在,2NF假设primary keycomposite primary key,意思是两个或多个字段的组合。

示例:(客户的订单明细

现在,下面我们有一个订单明细表,其复合主键为OrderIDProductID

  +-----------------------------------------------
  + OrderID  ProductID   ProductName      Quantity
  +-----------------------------------------------
  + 1        WM101       Washing Machine   1           
  + 2        EI201       Electric Iron     1

在这种情况下,上述ProductName部分取决于ProductID,但不取决于OrderIDProductID composite primary key

因此,您可以删除ProductName并将其放在Product表上,将其归一化。

Order Details表:

  +----------------------------------
  + OrderID  ProductID   Quantity
  +----------------------------------
  + 1        WM101         1           
  + 2        EI201         1

Products表:

  +----------------------------------
  + ProductID ProductName   QuantityOnHand
  +----------------------------------
  + WM101     Washing Machine   20           
  + EI201     Electric Iron     40

第三范式(3NF):没有过渡性依赖

示例:(客户及其相应的销售代表

  +-----------------------------------------------------------------------------------------
  + CustomerID  CustomerLastName   CustomerFirstName   RepID   RepLastName     RepFirstName
  +----------------------------------------------------------------------------------------
  + 101         James              Grace               SR101   Bravo           Brave
  + 102         Gordon             Ronald              SR102   Alpha           Alfonso
  + 103         Moore              Jeff                SR101   Bravo           Brave

在上述情况下,RepLastNameRepFirstName取决于RepIDRepID依赖CustomerIDSalesRep上,所以它是过渡性的,而不是直接依赖主键。

因此,为了规范化,您需要为 +----------------------------------------- + RepID RepLastName RepFirstName +----------------------------------------- + SR101 Bravo Brave + SR102 Alpha Alfonso 创建一个单独的表格,如下所示:

Customers

您的 +---------------------------------------------------------- + CustomerID CustomerLastName CustomerFirstName RepID +---------------------------------------------------------- + 101 James Grace SR101 + 102 Gordon Ronald SR102 + 103 Moore Jeff SR101 表现在看起来像这样:

{{1}}