我是SQL的新手,我很难知道什么是好的,坏的,更好的或最好的设计。
我有一个SQL 2008数据库,我和Entity Framework 4.3一起使用。我试图规范化我的数据库。
在我的设计中,我有2个表应用程序和接受应用程序。
AcceptedApplications只是Applications表的扩展,因为您猜对了,AcceptedApplications。这仅包含与被拒绝的申请无关的进一步信息。
Application和AcceptedApplications之间存在外键关系,因此在插入AcceptedApplication之前,应用程序必须存在。
但是,我也在考虑在应用程序表中添加一个字段来表明它是否被接受,例如“IsAccepted'
”。问题是,这是否必须?作为一个新手,我不一定知道有关Benfits(如果有的话)只是检查ApplicationAccepted中是否存在ID或者将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
在这种情况下,CoursesTaken
是Multi-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 key
是composite primary key
,意思是两个或多个字段的组合。
示例:(客户的订单明细)
现在,下面我们有一个订单明细表,其复合主键为OrderID
和ProductID
+-----------------------------------------------
+ OrderID ProductID ProductName Quantity
+-----------------------------------------------
+ 1 WM101 Washing Machine 1
+ 2 EI201 Electric Iron 1
在这种情况下,上述ProductName
部分取决于ProductID
,但不取决于OrderID
和ProductID
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
在上述情况下,RepLastName
和RepFirstName
取决于RepID
而RepID
依赖CustomerID
在SalesRep
上,所以它是过渡性的,而不是直接依赖主键。
因此,为了规范化,您需要为 +-----------------------------------------
+ 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}}