Database 规范化具有低完整性的表
我得到了一张大约18000行的桌子。每个记录描述一个客户的位置。问题是,当该人员创建表时,他们没有为“公司名称”添加字段,只添加“位置名称”,一个公司可以有多个位置 例如,以下是描述同一客户的一些记录: 位置表Database 规范化具有低完整性的表,database,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
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
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
Company_ID Company_Name
1 The Town Shop
我的目标是让它看起来像:
位置表
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
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
Company_ID Company_Name
1 The Town Shop
公司表
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
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
Company_ID Company_Name
1 The Town Shop
没有“公司”表,我必须从代表多个地点的最具描述性或最佳地点名称生成公司名称列表
目前,我认为我需要生成一个类似的位置名称列表,然后手动浏览该列表
任何关于我如何处理这一问题的建议都将不胜感激
@Neall,谢谢你的发言,但不幸的是,每个位置名称都是不同的,没有重复的位置名称,只有相似的名称。因此,在语句的结果中,“repcount”每行为1。
yukondude,你的第四步是我问题的核心。我以前不得不这么做。唯一真正的方法是手动匹配各个位置。使用数据库的控制台界面和分组select语句。首先,添加“公司名称”字段。然后:
SELECT count(*) AS repcount, "Location Name" FROM mytable
WHERE "Company Name" IS NULL
GROUP BY "Location Name"
ORDER BY repcount DESC
LIMIT 5;
找出列表顶部位置所属的公司,然后使用更新更新您的公司名称字段。。。其中“位置名称”=“位置”语句
另外,你真的应该把你的公司名称和地点名称分解成单独的表,并用它们的主键来引用它们
更新:-哇-没有重复?您有多少记录?请更新问题,您有可用的公司名称列表吗?我这样问是因为你也许可以使用Levenshtein算法来找到你的公司名称列表和地点名称之间的关系
更新
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
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
Company_ID Company_Name
1 The Town Shop
没有公司名称列表,我必须从代表多个地点的最具描述性或最佳地点名称生成公司名称
好的。。。试试这个:
上述操作的全部目的是使部件自动化并限制问题的范围。它还远远不够完美,但有望为您省去手工查看18K记录的麻烦。我本来打算推荐一些复杂的令牌匹配算法,但要想正确匹配它确实很难,如果您的数据没有太多的相关性(打字错误等),那么它就不会给出很好的结果
我建议您向提交一个作业,并让人工进行排序。理想情况下,您可能需要一个名为Company的单独表,然后在此“Location”表中使用Company\u id列,该列是Company表主键的外键,可能称为id。这样可以避免此表中出现大量文本重复(超过18000行时,整数外键将在varchar列上节省大量空间) 但您仍然面临加载该公司表,然后将其与位置中的行正确关联的方法。没有通用的解决方案,但您可以按照以下方式进行操作:
如果您可以复制位置表,您可以逐步构建一系列SQL语句来填充公司id外键。如果您出错,您可以重新开始并重新运行脚本直到失败。是的,我上一篇文章中的第4步非常糟糕 不管怎样,您可能需要手动完成其中一些操作,但您可能能够自动完成大部分操作。对于您给出的示例位置,以下查询将设置适当的公司id值:
UPDATE Location
SET Company_ID = 1
WHERE (LOWER(Location_Name) LIKE '%to_n shop%'
OR LOWER(Location_Name) LIKE '%tts%')
AND Company_ID IS NULL;
我相信这会与您的示例相匹配(我添加了IS NULL
部分,以避免覆盖以前设置的公司ID值),但当然,在18000行中,您必须非常有创造性地处理各种组合
另一个可能有帮助的方法是使用公司中的名称来生成类似上面的查询。您可以执行以下操作(在MySQL中):
然后只运行它生成的语句,这可能会