Да, ако има възможност можете да поставите и двете last, first
и first last
в базата данни, по-добрият начин е да проектирате схемата си правилно.
Ако някога откриете, че се опитвате да търсите или по друг начин да манипулирате части от колони, вашата схема почти сигурно е повредена. Почти сигурно ще убие производителността.
Правилният начин е таблицата да е така:
T1 FirstName LastName
== ========= ========
1 Pax Diablo
2 Bob Smith
3 George Jones
Тогава можете по-ефективно да разделите въведеното от потребителя име (веднъж, преди да изпълните заявката), вместо да се опитвате да разделяте всяко едно име в базата данни.
В случай, че базата данни винаги съдържа last, first
, всъщност може да не е необходимо за промяна на схемата.
Проблемът, който имате в този случай, е просто да интерпретирате въведеното от потребителя.
Една възможност, въпреки че е убиец на производителността, е да направите like
за всяка отделна дума. Така че, ако потребителят е въвел pax diablo
, резултатната ви заявка може да бъде:
select T1 from mytable
where T2 like '%pax%'
and T2 like '%diablo%'
По този начин не се интересувате толкова от реда.
Въпреки това, като се има предвид неприязънта ми към бавните заявки, бих се опитал да избягвам това, освен ако не е абсолютно необходимо (или вашата база данни е сравнително малка и вероятно ще остане такава).
Има всякакви начини за ускоряване на тези видове заявки, като например:
- използване на всички възможности за търсене в пълен текст, които вашата СУБД има.
- емулиране на такива способности чрез извличане и съхраняване на думи по време на задействания за вмъкване/актуализиране (и премахването им по време на задействания за изтриване).
- този предишен случай, но също така и осигуряване на допълнителни колони, използвани с малки стойности на текущата колона (за скорост).
- каже на потребителя да използва
last, first
форма за търсене. - опитвайки се да избегнете
%something%
низ за търсене колкото е възможно повече (сsomething%
, все още могат да се използват индекси). - моят по-рано споменат метод "разделяне на името на две колони".