我的信息包含以下组件
RecID
UID
Name
Namevariant1
Namevariant2
NameVariant可以被认为是名称别名 - 例如," John Paul"可以被称为" JP",所以如果寻求JP的信息,那么我应该能够将JP与John Paul匹配。
当然,我想看看我的输入名称是否属于这些变体(包括完全匹配)。
我看到两种方法:
a)将Name,NameVariant1,NameVariant2作为列。查找将是以下查询:
select * from <table> where Name=<input> OR NameVariant1=<input> OR NameVariant2=<input>
为了速度,我可能想在Name,NameVariant1,NameVariant2上创建索引。
b)具有单独的表,其中包含变体的映射,以及与这些别名关联的记录(捕获为记录集,具有合适的分隔符):
RecID
UID
Name
Variant
RecordSet
通过计划(b),我们可以避免存储重复的别名。例如,&#34; John Peter&#34;和#34; John Paul&#34;拥有相同的别名&#34; JP&#34;,所以我不必存储&#34; JP&#34;两次。
请注意,这些表格中预计会有大量输入,大约有几百万条记录。
关于查找性能,我很困惑:假设有&#39; N&#39;记录,计划(a)查找相当于在3个不同列中搜索 - 转换为3 *(对&lt; = N元素进行DB查找)。对于计划(b),查找相当于沿最多3N行搜索[如果所有别名彼此不同,则每个记录将有3个别名,因此第二个表中将有3N个记录]。因此,计划(b)的复杂性是(DB查找&lt; = 3N元素)。
所以,问题是:哪种策略更好? 3 *(对&lt; = N元素进行DB查找)或(对&lt; = 3N元素进行DB查找)
出于实际目的,可以假设重复条目的数量非常少,因此不同别名的总数将接近3N。