我有一个公司目录,他们希望在MySQL数据库中存储和更新。每个公司记录都没有公司#1234等唯一标识符。
这些字段是邮件列表,联系人姓名,公司名称,街道地址,城市,州,邮政编码,电话号码和公司类型的典型字段。更新将作为CSV文件发送给我,同样没有公司唯一标识号。
如何将数据库中存储的记录与新记录匹配,以便更新?在这个行业中,联系人姓名可以更改,甚至可以更改公司名称,因为他们会添加和减少合作伙伴。他们的街道地址可以改变,因为当他们搬家时,他们甚至可以改变他们的电话号码。大多数公司都有一个网站网址,所以希望它不会经常改变,但也很容易改变。
我在MySQL中看到有类似的匹配%,这是否可以将记录与新信息匹配?
如果有PHP解决方案,我在PHP工作。在此之前,请感谢善良的人帮助我解决这个问题!
答案 0 :(得分:2)
没有主键,它总是很棘手。
一线解决方案,决定最符合您要求的规则。
如果我是你,我首先会去客户决定识别类似记录的一些规则。没有主键,此步骤是必要的,因为总是有可能重复输入或更新错误记录。
规则可以很简单:
1. Available fileds:
contact name,
company name,
street address,
city,
state,
zip code,
phone number and
type of company (I Hope this is industry)
2. We will first match company name for similarity like
select * from table_name where company_name like '%$company_name%'
3. For all found records, match zip code and phone number. If match, break, record needs to be updated
4. If not match found in step 3, match street address. If match, break, record needs to be updated
5. & so on.
您的客户是决定这些规则的最佳人选,因为他是产品的所有者。
另一方面,在没有主键的情况下,向客户询问规则对于保证您的安全也很重要,即使经过全部照顾,也总是有可能重复记录和/或或更新错误的记录。你可以用最好的规则来减少机会。
答案 1 :(得分:1)
正如您所说的那样,表格的所有字段都可以改变,但我认为无论您选择哪种算法,都没有简单的方法来正确更新表格。
实现此目的的方法之一可能是要求人/系统(向您发送更新的记录)也包括csv文件中更新字段的旧值。如果您有旧值,则可以轻松地将它们与当前记录匹配,并使用新值更新它。
答案 2 :(得分:0)
这是一个相当普遍的问题,但解决方案本身在项目之间有些独特。
我将迭代所有按其更改时间排序的记录(或创建日期或更新时间戳等)。接下来,我将匹配所有与主要字段相似的条目:公司名称,地址(尽管可能存在风险),电话或网址(仅解析域名)。然后,我会递归迭代所有找到的条目,直到找不到更多的结果。
只要没有一次更改所有主要列,此算法将有助于找到相同的条目。如果他们这样做,就没有办法以编程方式说明它是同一家公司。
这会将行与看似现在的连接(示例中的第1行和第3行)链接
示例:
2001/01/01 Awesome firm, awesome.com
2002/02/02 Awesome firm, newaddress.com // linked with the first row over company name
2010/12/05 Ohsome inc, newaddress.com // linked over url
答案 3 :(得分:0)
我在早期的一个Sql server项目中遇到了类似的情况。我曾经做过以下事情来处理它。
1.通常会有两种类型的文件 -
a)完整饲料(每周频率)这将包括来自提供者数据库的所有公司 b)增量Feed(每日频率)这将只有新的记录,这些记录不是完整的饲料和更新。(插入-I,更新-U作为增量饲料中的标志)
2.因此,一旦我收到完整的Feed,我将在一周内使用完整的Feed刷新我的数据库表。此外,我将为每个公司记录提供内部ID。(这些ID用于内部目的)< / p>
3.每天我根据标志处理增量Feed(I-insert,U-update)。
4.此处非常重要的一点是管理映射表。一旦提供了源,只需为其分配一个新的内部ID。
5.为了比较数据以避免重复,我曾经使用模糊算法来获得所有可能的匹配,然后使用通配符来过滤和识别哪些是新的和重复的。
答案 4 :(得分:0)
查看Damerau-Levenshtein距离算法。它计算两个字符串之间的“距离”,并确定将一个字符串转换为另一个字符串所需的步数。两个弦越近,步数越少。
This文章显示了作为MySQL存储函数实现的算法。 Here's PHP版本。
该算法比LIKE或SOUNDEX好得多。