# Re: NULLs: theoretical problems?

Date: Fri, 10 Aug 2007 11:56:05 GMT

Message-ID: <pnYui.44899$Um6.1259_at_newssvr12.news.prodigy.net>

"Brian Selzer" <brian_at_selzer-software.com> wrote in message
news:cfYui.44898$Um6.30686_at_newssvr12.news.prodigy.net...

*>
*

> "David Portas" <REMOVE_BEFORE_REPLYING_dportas_at_acm.org> wrote in message

*> news:NM-dncYFOuhqBybb4p2dnAA_at_giganews.com...
**>> "paul c" <toledobythesea_at_oohay.ac> wrote in message
**>> news:JXLui.45171$rX4.26997_at_pd7urf2no...
**>>>
**>>> (even though I'm not sure in "s{X} = t{X} implies s{Y} = t{Y}" whether
**>>> "implies" stands for logical implication.)
**>>>
**>>
**>>
**>> Good catch. It seems that logical implication is not well defined for
**>> three-value logic. According to Lex de Haan and Toon Koppelaars' recent
**>> book:
**>>
**>> P | Q | P->Q
**>> --------------
**>> T | U | U
**>> F | U | T
**>> U | T | T
**>> U | F | U
**>> U | U | U or T?
**>>
**>> So possibly I have to modify what I said about no attribute with nulls
**>> satsifying any FD. Although some dependencies may be satisfied it won't
**>> be
**>> enough for 2NF or anything higher because {K}->{N} is never true where K
**>> is
**>> a key and N is an attribute which has nulls.
**>
**> I would say instead that {K} --> {N} is indeterminate when N is an
**> attribute that allows nulls, because just in case every tuple has a value
**> for N, {K} --> {N} holds.
**>
**> If a schema is in 5NF whenever every applicable value is present, then
**> null can have one and only one interpretation: an applicable value is not
**> present. What you have then is an incomplete relation: an irregular set
**> of tuples. For example, a predicate P(a, b, c) for a relation R{A, B, C}
**> where A is the key is equivalent to:
**>
**> (a in dom(A)) /\ (b in dom(B)) /\ (c in dom(C)) /\ p
**> where p is a conjunction of the constraints for R.
**>
**> Suppose that dom(C) = {1, 2, 3}, then an incomplete tuple,
**>
**> {a = 15, b = 23} represents something like
**>
**> (a = 15) /\ (b = 23) /\ (((c = 1) /\ ~(c = 2) /\ ~(c = 3)) \/
**> (~(c = 1) /\ (c = 2) /\ ~(c = 3)) \/
**> (~(c = 1) /\ ~(c = 2) /\ (c = 3))) /\ p
**>
**> Note that c in dom(C) is equivalent to
**> ((c = 1) /\ ~(c = 2) /\ ~(c = 3)) \/
**> (~(c = 1) /\ (c = 2) /\ ~(c = 3)) \/
**> (~(c = 1) /\ ~(c = 2) /\ (c = 3)).
**>
**> I would argue, therefore, that the FD A --> C holds, even if C allows
**> nulls.
*

Correction: I would argue, therefore, that the FD A --> C is true, even if C allows nulls.

> Can't an FD X --> Y be expressed this way:

*>
**> exists x exists! y (x in dom(X)) /\ (y in dom(Y))
**>
**> where exists! is a quantifier that means "there is one and only one?" And
**> doesn't
**> ((c = 1) /\ ~(c = 2) /\ ~(c = 3)) \/
**> (~(c = 1) /\ (c = 2) /\ ~(c = 3)) \/
**> (~(c = 1) /\ ~(c = 2) /\ (c = 3))
**> mean that C has at most one value?
**>
**>>
**>> The fact that attributes with nulls don't satisfy join dependencies
**>> remains very solid and much more obvious.
**>>
**>> --
**>> David Portas
**>>
**>>
**>>
**>
**>
*

Received on Fri Aug 10 2007 - 13:56:05 CEST