Sql 规范化表的模式

Sql 规范化表的模式,sql,sql-server,normalize,Sql,Sql Server,Normalize,我对SQL相当陌生,所以我很难知道什么是好的、坏的、好的还是最好的设计 我有一个SQL 2008数据库,与Entity Framework 4.3一起使用。我正在尝试规范化我的数据库 在我的设计中,我有两个表应用程序和接受的应用程序 AcceptedApplications只是Applications表的一个扩展,因为您猜到了AcceptedApplications。这只是包含与被拒绝的应用程序无关的进一步信息 应用程序和AcceptedApplication之间存在外键关系,因此必须先存在应用

我对SQL相当陌生,所以我很难知道什么是好的、坏的、好的还是最好的设计

我有一个SQL 2008数据库,与Entity Framework 4.3一起使用。我正在尝试规范化我的数据库

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

AcceptedApplications只是Applications表的一个扩展,因为您猜到了AcceptedApplications。这只是包含与被拒绝的应用程序无关的进一步信息

应用程序和AcceptedApplication之间存在外键关系,因此必须先存在应用程序,然后才能插入AcceptedApplication

然而,我也在考虑在Application表中添加一个bit字段,以指示它是否被接受,比如“IsAccepted”


问题是,这是绝对必要的吗?作为一名新手,我不一定知道简单检查ApplicationAccepted中是否存在ID或将两个表合并在一起的好处(如果有的话)。就使用而言,我不会仅出于分析/报告目的在live网站上查询被拒绝的应用程序。

IsAccepted bit字段似乎更合理

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

我相信这是不太可能的,但根据您的实际需要,这听起来可能很有用


请注意,这两种解决方案都是第三种标准形式。

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

您的应用程序表可能具有以下结构:

表:应用程序

 ApplicationID, Applicant_Lastname, Applicant_Firstname, ApplyDate, IsAccepted, AcceptedDate
规范化
中的键是有趣的
主键
。正如E.F.Codd所说,我将从记忆中引用“每一个非键(不是主键)都必须提供一个关于键(指主键)的事实,除了键之外什么都不能提供”

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

就我个人而言,我对前三种范式使用了一种记忆方法,即单词RePeaT(忽略元音)。首先是没有重复组或多值字段,其次是没有对主键的部分依赖,最后是没有暂时依赖

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

示例:(学生选修课程

在这种情况下,
CoursesTaken
是一个
多值
字段,违反了
1NF

要规范化,您可以创建一个名为
CourseTaken
的单独表(现在我假设已经有一个
Course
表),如下所示:

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

  +--------------------------------------------------------------
  + StudentID  StudentLastName   StudentFirstName   CoursesTaken
  +--------------------------------------------------------------
  + 101        Smith             John             CS100
  + 101        Smith             John             CS102
  + 101        Smith             John             CS103
  + 102        Gilmore           Anna             MS100
  + 102        Gilmore           Anna             CS101
  +-----------------------------------------
  + RepID   RepLastName     RepFirstName
  +-----------------------------------------
  + SR101   Bravo           Brave
  + SR102   Alpha           Alfonso
  +----------------------------------------------------------
  + CustomerID  CustomerLastName   CustomerFirstName   RepID 
  +----------------------------------------------------------
  + 101         James              Grace               SR101 
  + 102         Gordon             Ronald              SR102
  + 103         Moore              Jeff                SR101
要规范化,它将与上面相同,但是您的
Student
表将只是:

  +-----------------------------------------------
  + StudentID  StudentLastName   StudentFirstName  
  +-----------------------------------------------
  + 101        Smith             John             
  + 102        Gilmore           Anna 
第二范式(2NF):无部分依赖

现在,这里的
2NF
假设
主键
是一个
复合主键
表示两个或多个字段的组合

示例:(客户的订单详细信息)

现在,下面我们有一个Order Details表,它的复合主键为
OrderID
ProductID

  +-----------------------------------------------
  + OrderID  ProductID   ProductName      Quantity
  +-----------------------------------------------
  + 1        WM101       Washing Machine   1           
  + 2        EI201       Electric Iron     1
在上述情况下,
ProductName
部分依赖于
ProductID
,但不依赖于
OrderID
ProductID
,它们是
组合主键

例如,您可以通过删除
ProductName
并将其放在
产品
表中来规范此项

订单详情
表格:

  +----------------------------------
  + OrderID  ProductID   Quantity
  +----------------------------------
  + 1        WM101         1           
  + 2        EI201         1
  +----------------------------------
  + ProductID ProductName   QuantityOnHand
  +----------------------------------
  + WM101     Washing Machine   20           
  + EI201     Electric Iron     40
产品
表:

  +----------------------------------
  + OrderID  ProductID   Quantity
  +----------------------------------
  + 1        WM101         1           
  + 2        EI201         1
  +----------------------------------
  + ProductID ProductName   QuantityOnHand
  +----------------------------------
  + WM101     Washing Machine   20           
  + EI201     Electric Iron     40
第三范式(3NF):无暂时依赖性

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

在上述情况下,
RepLastName
RepFirstName
依赖于
RepID
,而
RepID
依赖于 在
CustomerID
上,因此它是过渡的,不直接依赖主键

因此,要规范化,您需要为
SalesRep
创建一个单独的表,如下所示:

  +--------------------------------------------------------------
  + StudentID  StudentLastName   StudentFirstName   CoursesTaken
  +--------------------------------------------------------------
  + 101        Smith             John             CS100
  + 101        Smith             John             CS102
  + 101        Smith             John             CS103
  + 102        Gilmore           Anna             MS100
  + 102        Gilmore           Anna             CS101
  +-----------------------------------------
  + RepID   RepLastName     RepFirstName
  +-----------------------------------------
  + SR101   Bravo           Brave
  + SR102   Alpha           Alfonso
  +----------------------------------------------------------
  + CustomerID  CustomerLastName   CustomerFirstName   RepID 
  +----------------------------------------------------------
  + 101         James              Grace               SR101 
  + 102         Gordon             Ronald              SR102
  + 103         Moore              Jeff                SR101
您的
Customers
表现在如下所示:

  +--------------------------------------------------------------
  + StudentID  StudentLastName   StudentFirstName   CoursesTaken
  +--------------------------------------------------------------
  + 101        Smith             John             CS100
  + 101        Smith             John             CS102
  + 101        Smith             John             CS103
  + 102        Gilmore           Anna             MS100
  + 102        Gilmore           Anna             CS101
  +-----------------------------------------
  + RepID   RepLastName     RepFirstName
  +-----------------------------------------
  + SR101   Bravo           Brave
  + SR102   Alpha           Alfonso
  +----------------------------------------------------------
  + CustomerID  CustomerLastName   CustomerFirstName   RepID 
  +----------------------------------------------------------
  + 101         James              Grace               SR101 
  + 102         Gordon             Ronald              SR102
  + 103         Moore              Jeff                SR101
为什么要对表进行非规范化?通常,这会有导致数据不匹配错误的风险。。。仅用于解决与性能相关的问题。
AcceptedApplications
中还有哪些附加属性?如果删除该表,您打算如何处理这些属性?