>>Netop derfor skal brugernavn IKKE være primær nøgle
> Hvad henviser du til her?
Så angiv i din tabel-konstruktion, at kolonnen for brugernavn skal have
en "unique"-constraint eller simpelthen primærnøgle:
CREATE TABLE user (
login varchar(20) PRIMARY KEY,
passhash CHAR(32),
?
> Det er en smagssag. Men som jeg læser MooreHojer's indlæg, er det
> indiskutabelt, at brugernavne skal være unikke. Indiskutable constraints
> ("invarianter") kan man lige så godt lægge i databasen, når det er
> muligt, så man lettere fanger bugs i sin frontend-kode. Og i dette
> tilfælde _er_ det muligt: Databasen har alle oplysninger, der skal bruges
> til at hitte ud af, om brugernavne opfylder den specificerede constraint.
Du har helt ret, sådan kan det læses. Du identifcerer dog også selv en
helt rigtig problematik omkring nedlægningen af gamle brugerkonti. Eller
måske udløb af brugerkonti ? I sådanne tilfælde er det ikke sikkert man
ønsker at udføre en faktisk sletning af den gamle bruger, men kun at
sætte et "slette-flag" på den gamle konto, hvorefter brugernavnet kan
bruges af en ny konto fordi den gamle nu er "slettet" ?
> Bemærk, at jeg med "frontend" mener alt mellem database og bruger, altså
> også inkl. n lag af middleware, hvis man bruger den slags begreber.
Fair nok - jeg var heller ikke helt kommet til n-tier diskussionen endnu
*g* Men man kunne godt lave en 2½-tier model, hvor man "misbruger" sin
scripting platform til at samle ... af, vent, det kommer i næse sektion
>>Check af
>>eksisterende brugernavn må betragtes som "forretningslogik" for dit
>>websted, og det bør du under alle omstændigheder konsolidere ét sted
>>(f.eks. dine scripting filer eller nogle komponent-filer du har
>>kompileret) frem for at have det spredt.
>
> Jeg vil hævde, at det er noget vrøvl, affødet af et tilfældigt
> branche-lune, hvor man tror, at databaser er "farlige" at rode med og
> databaseudviklere dyrere end frontend-kodere. (Med den uheldige
> konsekvens, at der rundt omkring opbygges store, bloat'ede imperative
> middleware-lag, der til sidst når en fedmegrad, der gør dem umulige at
> overskue).
Nej, nej, database kode er skam ikke farligt. Og DB folk er sikkert ikke
dyrere end programmører (og i en del tilfælde er det de samme folk der
er tale om).
Men man kan godt "misbruge" sin scripting platform til at samle den
slags funktioner. Der er jo intet der hindrer en programmør i, at samle
f.eks. check af brugerkonti i en PHP/ASP/CGI/JSP/osv fil der ikke
genererer HTML output, men blot returnerer et bolsk udtryk eller en
parameter som man kan bruge en masse andre steder. Det er ikke
"midlle-tier" eller "3-tier", men det er samme tanke - sådan lidt groft
sagt.
Performance mæssigt er der heller ikke den store straf, for alle moderne
webservere cacher en kompileret udgave af scripting filerne nu til dags
> Men bør bruge rette værktøj til rette job. Og når det gælder
> håndtering af "et brugernavn må kun optræde én gang", er databasen
> absolut det letteste sted at placere constraint'en:
> - DBMSet har direkte føling med data-tilstanden, og kan
> derfor opretholde invarianten lettere+hurtigere.
> - I SQL kan du implementere din invariant/constraint
> _deklarativt_, frem for at blande contraint-opretholdelse sammen
> med controller-kode i din frontend.
> - Databaser har det med at overleve frontends: Hvis du har
> de centrale invarianter defineret i din database, kan du med en vis
> sindsro udskifte/ændre frontend'en, eller tilføje andre frontends.
Peter Hansen har brugernavn "hansen" og har en konto. En dag nedlægger
han sin konto, eller han stopper med at betale/bruge sitet, hvorefter
hans konto automatisk udløber efter 12 måneder.
Jens Hansen opretter nu en konto. Han ønsker brugernavnet "hansen" som i
øvrigt ikke bliver brugt af andre brugere pt.
Hvis der er lavet en constraint i basen på brugernavn, så kræver det en
fuld og fysisk sletning af Peter Hansens gamle konto. Hvis der blot er
kodet et check af om der er AKTIV konti med det ønskede brugernavn, så
kan Jens Hansen få sin konto med brugernavn "hansen", uden at vi mister
alle oplysningerne om Peter og tvinges til at slette hans bruger record.
>>Desuden vil en overtrædelse af et constraint alligevel medføre, at der
>>skal programmeres fejlhåndtering når databasen brokker sig. Så er det
>>akkuerat lige så nemt at søge efter brugernavnet først, og konstatere om
>>der returneres 1<record eller ej ...
>
> Nej: Din løsning kræver en unødvendig søgning. Og fejlhåndtering fra
> databasen skal du under alle omstændigheder have styr på. Et tip er her
> at navngive unikheds-constraint'en på passende vis, så man i
> fejlsituationen let kan se, at det er login-unikhed, der er brudt. Se i
> denne forbindelse følgende ret udmærkede artikelserie (link'et går til
> artikel to af tre):
http://www.dbazine.com/celko26.shtml
Det er faktisk en rigtig god artikel, omend den har et lidt andet fokus.
Men tak for tippet
Jeg mener dog IKKE at der foretages en "unødvendig søgning". Jeg mener
den er ganske nødvendig. Og i øvrigt er det en misforståelse at en så
primitiv SELECT er det fjerneste problem for databasen. Det er en gammel
og dybt forældet mantra, at man skal begrænse antallet af søgninger.
Hvor mange ms. går der med at udføre en SELECT COUNT (*) WHERE username
= 'hansen' hvis der er et index på username ? Hvor mange cycles skal
basen bruge til det ? Ikke mange ! Det er akkurat lige så misforstet at
have skræk for søgninger af denne art, som at have skræk for at samle
sin forretningslogik i separate filer
Yes - så fik vi taget hul på de rellegiøse diskussioner *g*
- Jesper