规范化低完整性的表

Joe*_*ako 6 database

我已经交了一张大约18000行的桌子.每条记录描述一个客户的位置.问题是,当人创建表时,他们没有为"公司名称"添加字段,只添加"位置名称",而一个公司可以有多个位置.

例如,以下是描述同一客户的一些记录:

位置表

 ID  Location_Name     
 1   TownShop#1        
 2   Town Shop - Loc 2 
 3   The Town Shop     
 4   TTS - Someplace   
 5   Town Shop,the 3   
 6   Toen Shop4        
Run Code Online (Sandbox Code Playgroud)

我的目标是让它看起来像:

位置表

 ID  Company_ID   Location_Name     
 1   1            Town Shop#1       
 2   1            Town Shop - Loc 2 
 3   1            The Town Shop     
 4   1            TTS - Someplace   
 5   1            Town Shop,the 3   
 6   1            Toen Shop4        
Run Code Online (Sandbox Code Playgroud)

公司表

 Company_ID  Company_Name  
 1           The Town Shop 
Run Code Online (Sandbox Code Playgroud)

没有"公司"表,我将必须从表示多个位置的最具描述性或最佳位置名称生成公司名称列表.

目前我认为我需要生成一个类似的位置名称列表,然后手动浏览该列表.

关于如何处理这个问题的任何建议都表示赞赏.

@Neall,感谢您的发言,但不幸的是,每个位置名称都是截然不同的,没有重复的位置名称,只有类似的名称.因此,在您的语句结果中,"repcount"在每行中为1.

@yukondude,你的第4步是我的问题的核心.

Jak*_*raw 1

请更新问题,您有可用的公司名称列表吗?我问这个问题是因为您也许可以使用 Levenshtein 算法来查找 CompanyNames 和 LocationNames 列表之间的关系。


更新

没有公司名称列表,我必须从代​​表多个位置的最具描述性或最佳位置名称生成公司名称。

好吧...试试这个:

  1. 通过查找大部分或全部由字母字符组成的位置名称来构建候选公司名称列表。为此,您可以使用正则表达式。将此列表存储在单独的表中。
  2. 按字母顺序对该列表进行排序,并(手动)确定哪些条目应该是公司名称。
  3. 将每个 CompanyName 与每个 LocationName 进行比较并得出匹配分数(使用Levenshtein或其他字符串匹配算法)。将结果存储在单独的表中。
  4. 设置阈值分数,使得任何 MatchScore < 阈值都不会被视为与给定 CompanyName 的匹配。
  5. 按 CompanyName 手动审查 LocationNames | 地点名称 | MatchScore,并找出哪些真正匹配。按 MatchScore 排序应该可以减轻这个过程的痛苦。

上述操作的全部目的是使零件自动化并限制问题的范围。它远非完美,但有望帮助您省去手动查看 18K 记录的麻烦。