[DB-SIG] Portable method of determining which column wasn't u nique?
Johannes Erdfelt
johannes@erdfelt.com
Thu, 10 Oct 2002 16:41:49 -0400
On Thu, Oct 10, 2002, Keating, Tim <TKeating@origin.ea.com> wrote:
> A better way to deal with this might be to break up your tables along
> functional lines. Right now it sounds like you are trying to store login
> credentials and user information in the same table. A safer way to do this
> might be (in pseudo-DDL):
>
> Table LoginCredentials (
> int login_id PRIMARY KEY,
> char[] username UNIQUE,
> char[] password_hash
> )
>
> Table UserInfo (
> int user_id PRIMARY KEY,
> char[] name,
> char[] emailaddress
> .
> .
> .
> )
>
> Table LoginToUser (
> int login_id,
> int user_id
> )
>
> Now, you can add rows for both username=username AND username=email address
> to the LoginCredentials table, use a much simpler query to log them in, and
> then retrieve their personal info through the LoginCredentials ->
> LoginToUser -> UserInfo join.
>
> This isn't perfectly normalized, since email address is stored twice, but
> since you are overloading the purpose of email address anyway, it may be a
> better model for you. It also solves the original problem, since there is
> only one unique column.
And then I can assume any error that violates a unique constraint must
be the one unique column.
This is an interesting idea and looks like it would functionally work,
assuming transactions are used. I do use transactions and it would be a
reasonable requirement for the software I'm writing.
It's a little bit more complicated than I would have liked, but it's not
ugly and I think should be portable.
Thanks for the idea.
JE