我正在我的网站上创建一个成员列表,我想让他们通过名字和姓氏或其中任何一个来寻找彼此。问题在于,用户可以拥有多个名称,例如姓名和昵称,也可以是一个人可以拥有多个姓氏,他们的婚前姓名以及结婚后的姓氏。
一旦用户填写他们的姓名和姓氏,每个用户可以有多个姓名和姓氏,例如,可能有一个人有3个名字和2个姓氏 - 姓名:Eleonora,Ela,El和姓氏:Smith,Brown。
如果有人找Ela Brown,Eleonora Brown,Eleonora Smith或任何其他组合,他们应该找到这个人。
我的问题是,我应该如何在sql(mysql)中设置这一点,以便架构和搜索有效且快速?不想重新发明一个轮子所以我转向专业人士并在这里提问。
谢谢你们
P.S。我想标准的解决方案是拥有一个用户表,fname表,lname表,带有userid和fnameid的userfname表以及带有userid和lnameid的userlname表,但是我不确定这是否是最好的方法来做到这一点或不搜索会很快......
答案 0 :(得分:2)
您需要区分名字和姓氏吗?
我建议使用Users
表UserID
还有一些UsersNames
表UserID
和Name
,一对多的关系。
如果需要,您还可以在IsLastName
表格中添加UsersNames
位(或只添加LastName
列,但该位更好imho)....
但是这样你可以搜索一个表并轻松找到用户ID,而且你不会限制每个用户可以拥有的名字数。
修改强>
您可以轻松获取输入字符串并将其拆分。因此,如果有人输入“John Smith”,您只需分割字符串并使用WHERE
子句在OR
子句中使用AND
或{{1}}来搜索这两个或任一名称,具体取决于您的意图功能。
答案 1 :(得分:1)
我最后一次这样做了,我将每个名称都处理成NAMES表中的一个列。所有名字,第一个/最后一个/中间。第二个表格保存了PERSONS表中人员记录的链接。
因此每个NAME字段都链接到一个或多个PERSONS记录。如果我搜索“Scott”,我会在NAMES表中找到名称Scott,找到NAMES_TO_PERSONS(/ PEOPLE?)表中的链接,然后返回该名称的所有记录。即:Scott Bruns,John Scott,David Scott Smith。
只需少量预处理,效果非常好。
答案 2 :(得分:1)
您需要进行文字搜索 - 使用Lucene。我已经在几个项目中使用过Lucene而且真的很棒 - 不难使用且速度非常快。
答案 3 :(得分:0)
如果在您的数据模型中,用户可能有多个但有限数量的名称类型,那么最简单的解决方案是为存储名称类型的每个列创建indecies。您可以为名字,姓氏,昵称,婚前姓名等添加字段。此模型比具有一个多名称关联更具性能。
您还可以评估是否对应用程序的其余部分有一般搜索要求,或者您是否希望搜索更灵活。在这种情况下,您可以考虑使用后端索引流程,例如使用Lucene或使用full text search。最初,如果可能的话,我会尽量避免这种情况,因为它肯定会使项目变得复杂。