Mysql

高效的工作流程/查詢來保存獨特的資訊?

  • June 28, 2016

我正在將公司資訊保存在數據庫中。有一個帶有自動遞增鍵的表,每個公司都是唯一的。電子郵件、網站、電話號碼和公司名稱有單獨的表格。將新公司添加到數據庫時,應檢查各個表以查看是否已存在唯一數據。

例如,如果添加了新的電話號碼、電子郵件和網站,則應執行檢查以查看它們是否都已存在於數據庫中。如果存在電話號碼和電子郵件(唯一組合),那麼我想獲取這兩個條目的唯一公司 ID,並在網站表中添加一行,指示該網站現在與該公司 ID 相關聯。

但是,如果一個公司 ID 存在電話號碼和電子郵件,而另一個公司 ID 存在電子郵件和網站,我想將這兩個 ID 合併為一個。

我個人討厭這種設置,但我想不出一種更簡潔的方法來保存所有這些數據。例如,不能保證始終傳遞電話號碼、電子郵件或網站。此外,一些數據是相當主觀的。我可以輕鬆地從多個表中查詢電子郵件地址和電話號碼:

SELECT id FROM companies LEFT JOIN emails using(id) LEFT JOIN phones using(id) WHERE phone = "123" AND email = "john@smith.com"

但是比較組織名稱,WHERE查詢不會返回正確的結果。similar_text我在 PHP 中編寫了一個函式來使用and比較企業名稱soundex,但這些函式不能輕易地合併到 MySQL 查詢中。同樣,我用來區分企業的一項檢查是經度/緯度距離檢查。因此,我設想的工作流程(截至目前)是:

  1. 在 PHP 中遍歷每個未保存的公司簡介
  2. 從數據庫中獲取所有已保存的唯一資訊:

SELECT id, email, position, address, zip, organization_name, phone, website FROM companies left join emails using(id) left join locations using(id) left join organization_names using(id) left join phones using(id) left join websites using(id) 3. 在 PHP 中,循環遍歷每一行,嘗試在保存的值和未保存的值之間找到匹配項。 4. 如果存在唯一條目,請更新數據庫。如果不存在唯一條目,則將適當的行添加到數據庫中。

考慮到數據庫中保存的公司數量,我可以看到這非常低效,這就是我在這裡尋求幫助的原因。數據庫設計不是我的專長,所以任何建議都值得讚賞。

考慮到我要處理的條目數量,模糊匹配毫無意義。我需要一些東西來快速告訴我副本是否已經存在。因此,我最終為一家公司創建了所有獨特組合的雜湊值。例如,如果獲得了三組不同的資訊Company A

  1. phone+address+city第一組具有和的雜湊值phone+name
  2. 第二組有雜湊phone+email
  3. phone+email第三組具有和的雜湊值phone+name

集 1 和 2 的散列不重疊,但集 3 的散列位於兩個集中。因此,它們是同一個實體。如果沒有出現第 3 組,則第 1 組和第 2 組將被視為獨立的,因為它們沒有唯一的數據將它們連結在一起。

實際的數據庫實現仍在實現中。

我的解決方案是使用關係表而不是合併 ID,對錶電話號碼、電子郵件和網站等使用唯一性,並使用IGNORE類似的命令插入

Insert ignore into emails values (5,a.a@a.com);

If you use the IGNORE keyword, errors that occur while executing the INSERT statement are ignored. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row is discarded and no error occurs. Ignored errors may generate warnings instead, although duplicate-key errors do not.

或者如果您想更新重複項,請使用Replace而不是Insert ignore

REPLACE 的工作方式與 INSERT 完全相同,只是如果表中的舊行與 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,則在插入新行之前刪除舊行。

這樣您就不需要檢查重複項。如果您想要更複雜的重複檢查,您需要在程式碼中進行,而不是在數據庫中進行

引用自:https://dba.stackexchange.com/questions/141467