Pattern for normalized tables

跟風遠走 提交于 2019-12-13 05:09:13

问题


Im fairly new to SQL, so difficult for me to know whats good, bad, better or best design.

I have a SQL 2008 database which I'm using along with Entity Framework 4.3. I'm trying to normalize my database.

In my design I have 2 tables Applications and AcceptedApplications.

AcceptedApplications is simply an extension of the Applications table, for, you guessed it, AcceptedApplications. This simply contains further information that is not pertinent to rejected applications.

There is a foreign key relationship between Application and AcceptedApplications so an Application must exist before an AcceptedApplication can be inserted.

However, I am also contemplating putting a bit field in the Application table to indicate whether it is accepted or not, something like 'IsAccepted'.

The question is, is this strictly necessary? Being a newbie I'm not necessarily aware of the benfits (if any) over simply checking whether an ID exists in ApplicationAccepted or joining the 2 tables togther. In terms of use I will not be querying for rejected applications on the live website only for analytical/reporting purposes.


回答1:


An IsAccepted bit field seems more reasonable.

However, if for some reason there might be another Applications table, for instance for applications in the process of being accepted or that have been refused, with different fields, your current solution seems better.

I believe this to be very unlikely but depending on your actual needs this may sound useful.

Please note that both solutions are in 3rd normal form.




回答2:


There is a good chance that you don't need the two table simply because the Application table will suffice your need based in your information. And the field that you want to add to AcceptedApplication table, namely, the IsAccepted field could simply be added in your Application table.

You could probably have this structure for your application table:

Table: Application

 ApplicationID, Applicant_Lastname, Applicant_Firstname, ApplyDate, IsAccepted, AcceptedDate

The key in Normalization is interestingly the primary key. As E.F. Codd says and I'll be quoting from memory "Every non-key (meaning not the primary key) must provide a fact on the key (meaning the primary key) and nothing but the key".

For example the IsAccepted field actually is a non-key that is functionally dependent on the primary key ApplicationID so no need to create a new table for that matter.

Personally, I use a mnemonic device for the first three normal form, namely, the word RePeaT (ignoring the vowels). First is no Repeating groups or multivalued fields, second no Partial dependence on primary key and finally no Transitory dependence.

First Normal form (1NF): No Repeating Groups or Multivalued fields

Example: (Students taking Courses)

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

In this case CoursesTaken is a Multi-valued fields and is a violation of 1NF.

To normalized, you could create a separate table named CourseTaken (now I am assuming also here that there is already a Course table), like:

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

Or if a repeating groups, it would look like this:

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

To normalize, it would be the same as above however your Student table would simply be:

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

Second Normal form (2NF): No Partial dependence

Now, the 2NF assumes here that the primary key is a composite primary key meaning combination of two or more fields.

Example: (Order Details of a customer)

Now, below we have an Order Details table that has a composite primary key of OrderID and ProductID

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

In this case above ProductName is partially dependent on ProductID but not on OrderID and ProductID which are the composite primary key.

So, you could normalized this one by removing ProductName and put it instead on the Product table for example.

Order Details table:

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

Products table:

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

Third Normal form (3NF): No Transitory Dependence

Example: (Customer and their corresponding Sales Representative)

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

In the case above RepLastName and RepFirstName is dependent on RepID while RepID is dependent on CustomerID so it is transitional and not a direct dependence on the primary key.

So, to normalized you create a separate table for SalesRep that would look like this:

  +-----------------------------------------
  + RepID   RepLastName     RepFirstName
  +-----------------------------------------
  + SR101   Bravo           Brave
  + SR102   Alpha           Alfonso

And your Customers table would now look like this:

  +----------------------------------------------------------
  + CustomerID  CustomerLastName   CustomerFirstName   RepID 
  +----------------------------------------------------------
  + 101         James              Grace               SR101 
  + 102         Gordon             Ronald              SR102
  + 103         Moore              Jeff                SR101


来源:https://stackoverflow.com/questions/20188944/pattern-for-normalized-tables

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!