|
|
 | | From: | j.random.programmer | | Subject: | SQL design question: null vs. boolean values | | Date: | Sat, 15 Jan 2005 06:40:18 -0800 (PST) |
|
|
 | Hi all:
I was wondering if anyone had recommendations for the following scenarios:
(A) I have three radio boxes in the user form
field_foo []yes []no []unknown
These are mutually exclusive and user input is always required.
So in the database, should I have something like:
field_foo char(1) not null check (field_foo in 'y', 'n', 'u') ....OR.... field_foo char(1) check (field_foo in 'y', 'n')
The second choice always implies that NULL means unknown, whereas for the first choice, unknown is coded as 'u'.
(B) In the user form, I have a field like:
field_bar [] select_me
with ONE choice, which is optional.
Should I code this as:
field_bar char(1) not null check (field_foo in 'y', 'n') ....OR.... field_foo char(1) check (field_foo in 'y')
The second choice always implies that NULL means not selected whereas whereas for the first choice, selected is coded as 'y' and not selected coded as 'n'
Any advice, dear SQL experts ?
Best regards,
--j
__________________________________ Do you Yahoo!? Yahoo! Mail - 250MB free storage. Do more. Manage less. http://info.mail.yahoo.com/mail_250
---------------------------(end of broadcast)--------------------------- TIP 4: Don't 'kill -9' the postmaster
|
|
 | | From: | Andrew Sullivan | | Subject: | Re: SQL design question: null vs. boolean values | | Date: | Sat, 15 Jan 2005 10:05:33 -0500 |
|
|
 | On Sat, Jan 15, 2005 at 06:40:18AM -0800, j.random.programmer wrote: > field_foo char(1) check (field_foo in 'y', 'n') > > The second choice always implies that NULL means > unknown, > whereas for the first choice, unknown is coded as 'u'.
NULL actually means "unknown". SQL uses 3-valued logic: T, F, and NULL. So NULL here is a not-unreasonable choice. (Some would argue, however, that it's always better to have definite data. in which case, your three-option choice is what they'd prefer. My own view is that nullable boolean columns capture exactly the 3-value logic of SQL, so what's the problem?)
> In the user form, I have a field like: > > field_bar > [] select_me > > with ONE choice, which is optional. > > Should I code this as: > > field_bar char(1) not null check (field_foo in 'y', > 'n')
I'd use "boolean not null default 'f'", myself. But in any case, this is _not_ a use for NULL, because you know absolutely what the deal was: either the user selected, or else it didn't.
A -- Andrew Sullivan | ajs@crankycanuck.ca A certain description of men are for getting out of debt, yet are against all taxes for raising money to pay it off. --Alexander Hamilton
---------------------------(end of broadcast)--------------------------- TIP 9: the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match
|
|
 | | From: | Richard Huxton | | Subject: | Re: SQL design question: null vs. boolean values | | Date: | Sat, 15 Jan 2005 15:09:11 +0000 |
|
|
 | j.random.programmer wrote: > Hi all: > > I was wondering if anyone had recommendations for the > following scenarios: > > (A) > I have three radio boxes in the user form > > field_foo > []yes > []no > []unknown > > These are mutually exclusive and user input is always > required. > > So in the database, should I have something like: > > field_foo char(1) not null check (field_foo in 'y', > 'n', 'u') > ....OR.... > field_foo char(1) check (field_foo in 'y', 'n') > > The second choice always implies that NULL means > unknown, > whereas for the first choice, unknown is coded as 'u'.
Option 1 - the value is known, the user made a choice and it was to click the "unknown" box. The box could be labelled "marmalade" just as easily.
> (B) > In the user form, I have a field like: > > field_bar > [] select_me > > with ONE choice, which is optional. > > Should I code this as: > > field_bar char(1) not null check (field_foo in 'y', > 'n') > ....OR.... > field_foo char(1) check (field_foo in 'y') > > The second choice always implies that NULL means not > selected whereas whereas for the first choice, > selected is coded > as 'y' and not selected coded as 'n' > > Any advice, dear SQL experts ?
First option. I'm not convinced the choice is optional - you've presented the tickbox to them so you have to assume they've read it and chosen not to tick it.
-- Richard Huxton Archonet Ltd
---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
|
|
 | | From: | j.random.programmer | | Subject: | Re: SQL design question: null vs. boolean values | | Date: | Sun, 16 Jan 2005 05:59:36 -0800 (PST) |
|
|
 | Hi:
> > (A) > > I have three radio boxes in the user form > > > > field_foo > > []yes > > []no > > []unknown > > ... > > field_foo char(1) not null check > > (field_foo in 'y', 'n', 'u') > > ....OR.... > > field_foo char(1) check (field_foo in 'y', 'n') > >
> Option 1 - the value is known, the user made a > choice and it was to > click the "unknown" box. The box could be labelled > "marmalade" just as easily.
I see what you are saying. It's "known" that the user actually selected something (the choice they selected just happened to have a label "unknown").
NULL would be apprpriate if they had selected nothing at all, right ?
However, if a choice is required (meaning the front end html form cannot be submitted without some selection at least), then couldn't we fold unknown into NULL ?
i.e.,:
user choice yes -> 'y' no -> 'n' unknown -> null
Since it's guaranteed that the user will always choose something ?
In fact, this is as you say similar to:
user choice yes -> 'y' no -> 'n' marmalade -> null
I ran into another issue while designing my front end html form.
------------------------------------------ field_foo [ ] yes [ ] no
if you answered "yes" in field_foo above, you must enter detail here
foo_detail [ ] -------------------------------------------
This is a little tricky to capture in the database. The issue is that the nullability of one column depends AT RUNTIME on the value of another column (NOT at design time).
I ended up doing something like
create table xyz ( field_foo char(1) check (field_foo in 'y', 'n'), foo_detail varchar(255), check ( case when field_foo='y' and foo_detail is null then false else true end ) );
The constraint uses a case that *requires* some value foo_detail if field_foo is 'y'.
I don't know whether this is the recommended way to do the above or I'm making things too complicated.. Any other opinions/suggestions ?
Best regards,
--j
__________________________________ Do you Yahoo!? Yahoo! Mail - You care about security. So do we. http://promotions.yahoo.com/new_mail
---------------------------(end of broadcast)--------------------------- TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
|
|
 | | From: | PFC | | Subject: | Re: SQL design question: null vs. boolean values | | Date: | Sun, 16 Jan 2005 19:47:33 +0100 |
|
|
 |
> create table xyz > ( > field_foo char(1) check (field_foo in 'y', 'n'), > foo_detail varchar(255), > check ( > case > when field_foo='y' and foo_detail is null > then false > else true > end > ) > );
A simpler check would be :
CHECK( (field_foo = 'y' AND foo_detail IS NOT NULL) OR ( (field_foo = 'n' OR field_foo IS NULL) AND foo_detail IS NULL) )
Which means " field_foo can be y, n, or NULL, and foo_detail should be null except if field_foo is 'y' "
Also, IMHO, the Y/N/unknown case should have three values, NULL meaning 'the user has not answered this question'. Because if you insert a blank row in the table and fill it afterwards, you'll know if it was 'answered unknown' or 'unanswered'.
---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ?
http://www.postgresql.org/docs/faqs/FAQ.html
|
|
|