Ya, jika ada kemungkinan Anda dapat menempatkan keduanya last, first
dan first last
ke dalam database, cara yang lebih baik adalah mendesain skema Anda dengan benar.
Jika Anda pernah menemukan diri Anda mencoba mencari, atau memanipulasi, bagian kolom, skema Anda hampir pasti rusak. Ini hampir pasti akan mematikan kinerja.
Cara yang benar adalah dengan membuat tabel sebagai berikut:
T1 FirstName LastName
== ========= ========
1 Pax Diablo
2 Bob Smith
3 George Jones
Kemudian Anda dapat lebih efisien membagi nama yang dimasukkan pengguna (sekali, sebelum menjalankan kueri) daripada mencoba membagi setiap nama dalam database.
Dalam hal database selalu memegang last, first
, mungkin sebenarnya tidak diperlukan untuk perubahan skema.
Masalah yang Anda miliki dalam kasus itu hanyalah salah satu interpretasi dari apa yang dimasukkan pengguna.
Satu kemungkinan, meskipun merupakan pembunuh kinerja, adalah melakukan like
untuk setiap kata yang terpisah. Jadi, jika pengguna memasukkan pax diablo
, kueri yang dihasilkan mungkin:
select T1 from mytable
where T2 like '%pax%'
and T2 like '%diablo%'
Dengan begitu, Anda tidak terlalu peduli dengan pesanan.
Namun, mengingat ketidaksukaan saya terhadap kueri yang lambat, saya akan mencoba menghindarinya kecuali benar-benar diperlukan (atau database Anda relatif kecil dan cenderung tetap seperti itu).
Ada berbagai cara untuk mempercepat kueri semacam ini, seperti:
- menggunakan kemampuan pencarian teks lengkap apa pun yang dimiliki DBMS Anda.
- meniru kemampuan tersebut dengan mengekstrak dan menyimpan kata-kata selama pemicu penyisipan/pembaruan (dan menghapusnya selama pemicu penghapusan).
- kasus sebelumnya, tetapi juga memastikan kolom tambahan digunakan dengan nilai huruf kecil dari kolom saat ini (untuk kecepatan).
- memberi tahu pengguna bahwa mereka perlu menggunakan
last, first
formulir untuk mencari. - mencoba menghindari
%something%
cari string sebanyak mungkin (dengansomething%
, indeks masih dapat digunakan). - metode "membagi nama menjadi dua kolom" yang saya sebutkan sebelumnya.