是的,如果您有可能将两者都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%'
这样,您就不会太在意订单了。
但是,鉴于我不喜欢缓慢的查询,除非绝对必要(或者您的数据库相对较小并且可能保持这种状态),否则我会尽量避免这种情况。
有各种方法可以加快这些查询的速度,例如:
- 使用您的 DBMS 拥有的任何全文搜索功能。
- 通过在插入/更新触发器期间提取和存储单词(并在删除触发器期间删除它们)来模拟这种能力。
- 前一种情况,但也确保额外的列与当前列的小写值一起使用(为了速度)。
- 告诉用户他们需要使用
last, first
表单进行搜索。
- 尽量避免
%something%
搜索字符串(使用something%
, 索引仍然可以使用)。
- 我之前提到的“将名称分成两列”的方法。