Talk:Third normal form/Archive 2

Inconsistent Examples
An example of an un-normalised table should be given in the 1NF article. The same example should be continued, and the evolution of this non-NF table to a 3NF table(s) should be clearly shown in the subsequent 2NF and 3NF articles. This will improve the quality of each article, and help novice users and or beginners to database normalisation in clearly understanding the difference between 1/2/3NF and the steps needed to convert one to another.

iTommy 14:56, 8 May 2007 (UTC)


 * The trouble is that although beginners typically believe that a table is normalized step-by-step into 1NF, then into 2NF, then into 3NF, etc., actually this is not the case. Normalization is not an iterative process.  There is no evolution.  It's very important that novices understand this, rather than having the misconception reinforced.  For a deliberately contrived example in which we pretend it is an iterative process, see the Database Normalization article; but as a general rule the examples ought not to imply that a designer visits the lower normal forms one by one on the way to the higher.  --Nabav 19:36, 10 May 2007 (UTC)

someusername222 00:17, 26 Feb 2008 (GMT)
 * Fixed an error in the article:


 * Saying that "No non-prime attribute of the table is transitively dependent on a candidate key" is faulty from two perspectives.


 * 1) A candidate key? What key? That of the relation?
 * 2) If its a superkey then, but not a candidate key (which has the further property of being a minimal superkey), then what??? Can't the relation be in third normal form then? Yes it can, because the definition is on "every key of R", no matter if its strictly a superkey or furthermore a candidate key.


 * What was meant by the original version of the definition, which I admit was somewhat poorly phrased, was that there is no instance in which any non-prime attribute of the relation is transitively dependent on ANY candidate key of the relation. This is indeed equivalent to saying that every non-prime attribute is non-transitively dependent on every key (candidate as well as super).  I am happy with your change because, having checked the Codd original, I see that your way of expressing it more closely matches Codd's.  However, you have also applied a change to the definition of "non-prime attribute": you say that "a non-prime attribute is an attribute that is not a key in the relation".  This should instead say that a non-prime attribute is one that does not belong to any candidate key of the relation.  (Codd's definition - I've changed the text accordingly and provided a citation.)  --Nabav (talk) 12:59, 1 March 2008 (UTC)

Precision of the definitions
I am reverting a recent change that expanded the intro. This change involved analysing Codd's and Zaniolo's definitions in some moderate depth. The problem with the change is that 1) the intro is not the place for it (such analysis, if one wanted to do it, should go somewhere in the body of the article), and 2) the change introduced mistakes.

The mistakes are:

a) Asserting that Zaniolo's definition is more precise than Codd's. Actually, the Codd definition and the Zaniolo definition are exactly equivalent.  Perhaps I am at fault here for not making this more clear in the intro.

b) Saying that if we wish to normalize a relation to 3NF we only have to satisfy Zaniolo's definition. Again: the two definitions are exactly equivalent.  If you wish to satisfy 3NF, this amounts to saying that you wish to meet any set of conditions that accurately describes 3NF.

c) Offering still another 3NF definition that does not make explicit reference to 2NF ... then going on to prove that a 3NF table must satisfy 2NF. We're going round in circles here.  It is axiomatic that a 3NF table satisfies 2NF, because Codd's definition explicitly says so.   There is no need to prove your starting point after you've taken it as your starting point.  Codd's definition is the starting point for Zaniolo's reformulation, and it must be the starting point for any other possible reformulated definition of 3NF.

The changed intro then goes on to say something I agree with, namely 'if we wish to normalize a relation to a 3NF we do not have to "stop at 2NF along the way to 3NF"; instead, we go directly to 3NF.' This is absolutely correct but it has nothing to do with choosing between the Codd definition of 3NF, the Zaniolo definition of 3NF, or any other accurate definition of 3NF. The point about these definitions is that they are exactly equivalent.

The question "what is a 3NF table?" is a completely different question from "what processes should I go through in order to end up with a design whose tables are in 3NF?" The changed intro unfortunately conflated these two questions.--Nabav (talk) 20:52, 25 June 2008 (UTC)


 * Incidentally ... perhaps what started this is that the comments on this Talk page got reordered in a funny way, making it seem as though one of my comments was highlighting a problem in the intro section. In actuality I wasn't highlighting any such problem; I was making the usual point about normalisation not being an iterative process, but not being critical of the article's definitions in any way.--Nabav (talk) 21:08, 25 June 2008 (UTC)


 * Your point about intro not being the place for analysis of definition is well put. I have created a section in the article and referenced it in the intro.  As for my "mistakes", I hope the new section (which provides examples) is clearer.  Specifically, in respect to your enumeration, a) two definitions are not clearly equivalent (shown by example), b) consequently, Zaniolo's is preferred because it does not require me to think about 2NF, and c) if I started with Codd's original definition I'd be going in circles, but I didn't. Wikimiro (talk) 06:41, 26 June 2008 (UTC)


 * Hi Wikimiro. Thanks for moving the analysis to a new section, and for taking the time to make things more clear.  It's always good to see people showing an interest in the topic.  Unfortunately, though, your revised analysis has still got a pretty major flaw in it, and so I am reverting again.


 * You say:


 * "Consider relation R with attributes ABC and functional dependencies {A → B, B → C}. The only candidate key of R is A. R is in 2NF because no part of key functionaly determines any non-prime attribute. R is not in 3NF because A → C is a transitive functional dependency of a non-prime attribute C on key A. No problem so far. Let us now consider a different example, similar to relation R from previous example, with addition of B → A. In this case, B is another key of R. Using Zaniolo's definition, one can easily see that this new R is in fact in 3NF. Unfortunately, we can't say the same using Codd's original definition, because C is still transitively dependent (i.e. not directly dependent) on A, a key of R, which would imply that the relation is not in 3NF."


 * The problem is your assertion that in a relation ABC with {A → B, B → A, B → C}, C is not directly dependent on A and that therefore Codd's definition implies that this relation is not in 3NF. This assertion is incorrect.  C is directly dependent on A in exactly the same way that C is directly dependent on B.


 * To illustrate: let's say A is "Employee ID", B is "Employee Social Security Number", and C is "Employee Salary". The following are all true:


 * 1) {Employee ID} → {Employee Social Security Number}
 * 2) {Employee Social Security Number} → {Employee ID}
 * 3) {Employee ID} → {Employee Salary}
 * 4) {Employee Social Security Number} → {Employee Salary}


 * Your claim is that (3) is a transitive dependency. By saying (3) is a transitive dependency, you are saying that the only reason why {Employee ID} → {Employee Salary} is true is that (1) and (4) are true.  But you are mistaken here.  {Employee ID} → {Employee Salary} can be known directly, simply because each employee has a salary!  It is a straightforward direct (non-transitive) dependency.  Similarly, {Employee Social Security Number} → {Employee Salary} is also a straightforward non-transitive dependency.


 * The same reasoning would apply regardless of what examples of A and B (where A <--> B) were chosen. Where A <--> B, it must be true that anything directly dependent on A is also directly dependent on B, and vice-versa.


 * The upshot is, you are not justified in saying that the Codd definition is not equivalent to the Zaniolo definition. I really have to stress this: the two definitions are exactly equivalent.  Indeed, they have to be, because the way Zaniolo came up with his characterisation of 3NF was by drawing logical inferences from Codd's definition!  I recommend reading the Zaniolo paper, which will throw light on some of the things you are concerned with.


 * Still another misunderstanding in the new section is its contention that "By using Zaniolo's definition, we can reach 3NF ... directly, without having to 'visit' 2NF along the way." Again: not so.  Neither Codd's definition nor Zaniolo's definition tells us how to reach 3NF - they only tell us what 3NF is!  Codd's definition does not say: carry out such-and-such steps in order to reach 3NF.  It only says: here are some conditions - if your table meets them, then it is in 3NF.  Zaniolo's definition also says: here are some conditions - if your table meets them, then it is in 3NF.  What could possibly justify us in saying that checking against Zaniolo's conditions is better, easier, or more accurate than checking than Codd's?  As I've said: they are simply two alternative sets of conditions which are exactly equivalent.


 * None of this should stop you from preferring Zaniolo's definition. Different people will prefer different definitions.  But one thing we cannot do in an encyclopedia article is state your preference ("Zaniolo's definition of 3NF is preferred") as if it were an objective fact.--Nabav (talk) 14:52, 26 June 2008 (UTC)


 * Hi Nabav, I'm refining my contribution based on these discussions, and I'm hoping we will eventually reach a neutral point of view. I'm restoring most of my section.  I'm re-wording the part about 2NF downside (you make such a fine point about definition not being an algorithm), and I'm avoiding stating a preference (another good point).  As you say, you are free to use Codd's definition, with whatever understanding of it you have.  In the interest of Wikipedia completeness, the qualitative differences between the definitions are relevant.  That way, people other than you will see the differences I'm pointing out, and they will be free to use both definitions or just one.


 * Let me add a few things for general clarity. You say:


 * "Your claim is that (3) is a transitive dependency. By saying (3) is a transitive dependency, you are saying that the only reason why {Employee ID} → {Employee Salary} is true is that (1) and (4) are true.  But you are mistaken here.  {Employee ID} → {Employee Salary} can be known directly, simply because each employee has a salary!  It is a straightforward direct (non-transitive) dependency.  Similarly, {Employee Social Security Number} → {Employee Salary} is also a straightforward non-transitive dependency."


 * Let me frist clarify something you think I said. I did say that an FD such as (3) in your example is a transitive dependency, but I did not say "the only reason why A → C is true is because A → B and B → C."  In fact, I can say that A → C, A → B and B → C are all true, regardless of how we came up with A → C.  When checking whether a particular relation satisfies a NF definition, one looks at F+ (all FD's that can be stated as true), which is a closure of F (a set of FD's initially asserted by knowledge of data).  So, if we started with F = { A → B, B → C, B → A }, then F+ = { A → C, A → B, B → C, B → A, A → A, B → B, C → C } .  That said, if in F+ we find any FD that does not have a superkey on left, has a non-prime attribute on the right, and the right-side attribute does not belong to the left side, then we have found an FD that violates 3NF.


 * Now, you say that there are FD's that can be known directly (without transitivity), such as "each employee has a [single] salary." You imply that that is the "direct dependency" that Codd had in mind when he wrote his original definition.  Well, and I say this again, Codd wasn't really clear in his definition, and you are not to blame here.  But, whether an FD "can be known directly" or not is irrelevant because one has to examine F+.


 * To illustrate the problem with your interpretation of "direct dependency" further with an example... Consider relation {Employee, Salary}, which tells us what is Employee's salary.  Just by looking at this example you can say that {Employee} → {Salary} holds.  You called this dependency a "direct dependency" because it can be known without transitivity.  Now, consider a slightly modified relation {Employee, Salary, SalaryGrade}, and assume that the company has a policy that all salaries in one grade are the same.  Nothing really changed in our original understanding of {Employee} → {Salary}--you can still know it directly ("each employee has a [single] salary").  However, with this additional FD ({SalaryGrade} → {Salary}) the relation does not satisfy 3NF.  Wikimiro (talk) 01:57, 27 June 2008 (UTC)

Do we have a source (not Zaniolo or Codd) for the conclusions drawn in the section Third normal form? The content and style of this section look to me more like an essay. --Boson (talk) 06:38, 27 June 2008 (UTC)


 * Well, I'll tell you what, Wikimiro. We can leave your analysis section in the article for now, but with a factual-accuracy disputed tag because I am disputing the factual accuracy of it.  This dispute can be resolved, but only by recourse to the original Codd paper that contains the definition we are arguing about.  This paper is available in a long out-of-print book - which I have now ordered!  It should arrive in about a week.


 * I strongly suspect that this paper will reveal that in fact, Codd did define his terms precisely, and that actually we are at fault in this Wikipedia article for giving definitions (of transitive dependency and hence of Codd's 3NF) that do not quite match the definitions originally given.


 * In particular, I believe that I (not Codd!) am at fault for misrepresenting the definition of transitive dependency that Codd used in his definition of 3NF.


 * Consider this excerpt from Connolly and Begg, "Database Systems: A Practical Approach to Design, Implementation, and Management" (1998 edition), p. 206:


 * where A, B, and C are attributes of a relation ... if A → B and B → C, then C is transitively dependent on A via B (provided that A is not functionally dependent on B or C) (my italics).


 * Further, consider Zaniolo's definition of transitive dependency (p. 492 of the 1982 Zaniolo article cited by us):


 * Let R be a relation with attribute set U, let X be a subset of U, and let A be a member of U. A is transitively dependent on X if there exists a Y which is a subset of U, such that X → Y, Y does not → X, Y → A, and A is not a member of Y.


 * Finally, consider the definition of transitive dependency given even earlier by Philip A. Bernstein in "Synthesizing Third Normal Form Relations from Functional Dependencies", ACM Transactions on Database Systems (TODS) 1:4 (1976), p. 281:


 * Let R(A1, ..., An) be a relation. An attribute Ai is transitively dependent upon a set of attributes X if there exists a set of attributes Y which is a subset of {A1,..., An} such that X → Y, Y does not → X, and Y → Ai with Ai not an element of X or Y.


 * Where are these authors getting their definition of transitive dependency? Ultimately, I very strongly suspect, from Codd.  If I can verify this by looking at the original Codd text, then it will show that this whole controversy is of our own making!  It will show that the only reason we are arguing about alleged problems in Codd's definition of 3NF is that we have misrepresented what Codd actually wrote.  And we will need to modify the article to give a definition of transitive dependency that matches how Codd (and all these other authors!) actually define it.


 * I have to thank you for calling attention to the ambiguity. It is something that needs to be cleared up, and we will clear it up in a way that is accurate and properly cited.  I think it's safe to say that, with the addition of your new section and with the dispute it has engendered, the article is in a transitional state at present.  (And I do rather agree with what Boson has said above.)  But like I say, I've ordered the original text and I'm sure this will allow us to resolve the dispute to everyone's satisfaction.--Nabav (talk) 10:32, 27 June 2008 (UTC)


 * Even with citations from Codd and Zaniolo, an analysis section that contains anything but obvious, undisputable differences of a non-evaluative nature would in my opinion constitute original research, unless backed up by several third-party citations. --Boson (talk) 17:40, 27 June 2008 (UTC)

Nabav, thank you for being forthright, and for working on including Codd's actual text, which is definitely in everyone's interest. I also agree that the analysis section could use references.Wikimiro (talk) 05:32, 28 June 2008 (UTC)


 * Hi - I'm now in possession of Codd's text ("Further Normalization of the Relational Model") and have revised the article to give the correct transitive dependency definition, with citation. Codd defines a transitive dependency as follows: a transitive dependency A → C occurs when A → B, B does not → A, and B → C.  Accordingly, there is no ambiguity or deficiency in Codd's definition, and Zaniolo's is exactly equivalent (I've included Zaniolo's proof in which he derives his 3NF conditions from Codd's; it is very brief).  The analysis section was predicated on an incorrect definition of transitive dependency (my fault, of course! as I was the one who gave the definition incorrectly in previous versions of the article); therefore I have removed that section.  —Preceding unsigned comment added by Nabav (talk • contribs) 22:06, 10 July 2008 (UTC)