Ja, hvis der er en mulighed, kan du sætte begge last, first
og first last
ind i databasen, den bedre måde er at designe dit skema korrekt.
Hvis du nogensinde finde dig selv i at prøve at søge på eller på anden måde manipulere dele af kolonner, er dit skema næsten helt sikkert brudt. Det vil næsten helt sikkert dræbe ydeevnen.
Den korrekte måde er at have tabellen således:
T1 FirstName LastName
== ========= ========
1 Pax Diablo
2 Bob Smith
3 George Jones
Så kan du mere effektivt opdele det brugerindtastede navn (en gang, før du kører forespørgslen) i stedet for at prøve at opdele hvert enkelt navn i databasen.
I det tilfælde, hvor databasen indeholder altid last, first
, er det muligvis ikke nødvendigt for en skemaændring.
Det problem, du har i så fald, er simpelthen at fortolke, hvad brugeren har indtastet.
En mulighed, selvom det er en præstationsdræber, er at lave en like
for hvert særskilt ord. Så hvis brugeren indtastede pax diablo
, kan din resulterende forespørgsel være:
select T1 from mytable
where T2 like '%pax%'
and T2 like '%diablo%'
På den måde er du ligeglad med ordren.
Men i betragtning af min modvilje mod langsomme forespørgsler, ville jeg prøve at undgå det, medmindre det er absolut nødvendigt (eller din database er relativt lille og sandsynligvis forbliver sådan).
Der er alle mulige måder at fremskynde den slags forespørgsler på, såsom:
- ved at bruge de fuldtekstsøgningsmuligheder, som dit DBMS har.
- emulere sådanne evner ved at udtrække og gemme ord under indsættelses-/opdateringsudløsere (og fjerne dem under sletteudløsere).
- det tidligere tilfælde, men også at sikre ekstra kolonner, der bruges med små bogstaver i den aktuelle kolonne (for hastighed).
- fortælle brugeren, at de skal bruge
last, first
formular til søgning. - forsøger at undgå
%something%
søgestreng så meget som muligt (medsomething%
, indekser kan stadig bruges). - min tidligere nævnte "opdel navnet i to kolonner"-metode.