Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 规范化具有低完整性的表_Database - Fatal编程技术网

Database 规范化具有低完整性的表

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

我得到了一张大约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        
 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 
没有公司名称列表,我必须从代表多个地点的最具描述性或最佳地点名称生成公司名称

好的。。。试试这个:

  • 通过查找大部分或全部由字母字符组成的位置名称,建立候选公司名称列表。你可以用这个。将此列表存储在单独的表中
  • 按字母顺序对列表进行排序,并(手动)确定哪些条目应为CompanyNames
  • 将每个CompanyName与每个LocationName进行比较,得出匹配分数(使用或其他字符串匹配算法)。将结果存储在单独的表中
  • 设置阈值分数,使任何MatchScore<阈值都不会被视为与给定CompanyName匹配
  • 通过CompanyName | LocationName | MatchScore手动检查LocationNames,并找出实际匹配的位置。按MatchScore排序应该可以减少这个过程的痛苦

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

    我本来打算推荐一些复杂的令牌匹配算法,但要想正确匹配它确实很难,如果您的数据没有太多的相关性(打字错误等),那么它就不会给出很好的结果


    我建议您向提交一个作业,并让人工进行排序。

    理想情况下,您可能需要一个名为Company的单独表,然后在此“Location”表中使用Company\u id列,该列是Company表主键的外键,可能称为id。这样可以避免此表中出现大量文本重复(超过18000行时,整数外键将在varchar列上节省大量空间)

    但您仍然面临加载该公司表,然后将其与位置中的行正确关联的方法。没有通用的解决方案,但您可以按照以下方式进行操作:

  • 创建公司表,其id列自动递增(取决于您的RDBMS)
  • 查找所有唯一的公司名称并将其插入公司
  • 将一列company_id添加到接受null(目前)的位置,该位置是company.id列的外键
  • 对于位置中的每一行,确定相应的公司,并使用该公司的id更新该行的company_id列。这可能是最具挑战性的步骤。如果您的数据与示例中显示的数据相同,则可能需要使用各种字符串匹配方法多次运行
  • 一旦位置中的所有行都有一个company\u id值,那么您就可以修改company表,向company\u id列添加一个NOTNULL约束(假设每个位置都必须有一个company,这似乎是合理的)

  • 如果您可以复制位置表,您可以逐步构建一系列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中):

    然后只运行它生成的语句,这可能会