Sql 规范化表的模式
我对SQL相当陌生,所以我很难知道什么是好的、坏的、好的还是最好的设计 我有一个SQL 2008数据库,与Entity Framework 4.3一起使用。我正在尝试规范化我的数据库 在我的设计中,我有两个表应用程序和接受的应用程序 AcceptedApplications只是Applications表的一个扩展,因为您猜到了AcceptedApplications。这只是包含与被拒绝的应用程序无关的进一步信息 应用程序和AcceptedApplication之间存在外键关系,因此必须先存在应用程序,然后才能插入AcceptedApplication 然而,我也在考虑在Application表中添加一个bit字段,以指示它是否被接受,比如“IsAccepted”Sql 规范化表的模式,sql,sql-server,normalize,Sql,Sql Server,Normalize,我对SQL相当陌生,所以我很难知道什么是好的、坏的、好的还是最好的设计 我有一个SQL 2008数据库,与Entity Framework 4.3一起使用。我正在尝试规范化我的数据库 在我的设计中,我有两个表应用程序和接受的应用程序 AcceptedApplications只是Applications表的一个扩展,因为您猜到了AcceptedApplications。这只是包含与被拒绝的应用程序无关的进一步信息 应用程序和AcceptedApplication之间存在外键关系,因此必须先存在应用
问题是,这是绝对必要的吗?作为一名新手,我不一定知道简单检查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
中还有哪些附加属性?如果删除该表,您打算如何处理这些属性?