2010-09-17 74 views
6

我正在編寫一些代碼以在數據庫中查找重複的客戶詳細信息。我將使用Levenshtein距離。如何存儲雙向關係

但是,我不知道如何存儲關係。我一直都在使用數據庫,但從來沒有遇到過這種情況,並想知道是否有人能指出我正確的方向。

讓我困惑的是如何存儲關係的雙向性。

我已經開始把一些例子如下,但不知道是否有用於存儲這種類型的數據的最佳實踐,

實例數據

ID,地址

001, 5大街
002,5主街
003,5主海峽
004,6大街
005,7低街
006,7低聖

建議1

customer_id1,customer_id2,relationship_strength
001,002,0.74
001,003,0.77
002,003,0.76
005,006,0.777

對這種方法不滿意,因爲它有點推斷出cust之間的單向關係omer_id1到customer_id2。除非我同時包含所有關係,但是這會增加處理時間和表的大小。

例如需要包括:002,001,0.74

建議2

CUSTOMER_ID,GROUPING_ID
001,1
002,1
003,1
005,2-
006,2

回答

6

我們這裏有一個圖表,其中每個節點與每個其他節點都有一個關係(編輯距離)。這不在數據模型的正常範圍內。它也不是數據庫的永久功能(假設你解決了導致重複數據的業務流程),所以它不值得出售最適合關係理論的解決方案。我們需要的是一個實用的解決方案。

把它想象成一個矩陣。如果我們選擇最佳的處理方式,我們將不會執行重複的評分。所以我們對所有其他地址計分地址1,我們對地址1除地址2以外的所有其他地址計分,我們對地址1和2以外的所有其他地址計分地址3,等等。我們最終得到的是一點像足球聯賽表:

  addr 
      1 2  3 4  5 
addr 
    1  - 95 95 80 76 
    2  - - 100 75 72 
    3  - -  - 75 72 
    4  - -  - - 83 
    5  - -  - -  - 

該數據可以最好被存儲在提議1 ID1, ID2, SCORE表。雖然我們確實需要對數據進行透視以獲得如下輸出:)

在適當的排名表中,有兩組得分 - 主場和客場 - 所以桌子是對稱的。但這並不適用於此,因爲1 > 2的編輯距離與2 > 1相同。但是,如果結果集包含鏡像分數,它將更直接地查詢結果。也就是說,對於記錄(1,5,76),(2,5,72)等,我們生成記錄(5,1,76),(5,2,72)。這可以在評分過程結束時完成。

  addr 
      1 2  3 4  5 
addr 
    1  - 95 95 80 76 
    2  95 - 100 75 72 
    3  95 100  - 75 72 
    4  80 75 75 - 83 
    5  76 72 72 83  - 

當然,這主要是一個表象性的東西,所以它只需要做顯示目的,例如,將數據導出到電子表格。我們仍然可以得到,比如說,以可讀的方式處理5的所有得分,而無需使用一個簡單的SQL語句miiroring分數:

select case when id1 = 5 then id1 else id2 end as id1 
     , case when id1 = 5 then id2 else id1 end as id2 
     , score 
from your_table 
where id1 = 5 
or  id2 = 5 
/
+0

謝謝APC。該矩陣有意義並有助於將其可視化。這個SQL語句也是真的。謝謝。 – alj 2010-09-17 10:55:26

1

一如既往這取決於您計算完數據後要處理的數據。

假設它只是識別或定位重複項,那麼你的建議1就是我要用的,即第二個表,它只是存儲對和強項。我唯一的建議是將強度設爲縮放整數而不是小數。

+0

我需要將數據返回給維護它的人員,以便他們可以通過並檢查它。所以在這方面,我想第一個建議就足夠了。但我想知道是否存在一種「標準」的方式來存儲這些信息,這樣我就可以靈活地根據他們想要的內容輸出各種格式(因爲他們無疑會回來說他們希望以另一種方式完成它! )。 另外...提高我對數據庫模式的理解是一個很好的機會。 – alj 2010-09-17 08:42:27

+0

......並感謝理查德。 – alj 2010-09-17 10:56:38

+0

這是我一直這樣做的方式。有時候最簡單的解決方案正常工作,我們不需要尋求更復雜的解決方案。第一個解決方案可以工作,並且效率很高,並能夠產生您需要的結果。 – 2010-09-17 21:17:52

6

應對對稱關係關係系統的方法如下:

  • 選擇存儲對稱對的規範形式,例如customer_id1 < customer_id2。
  • 定義視圖SYMM_TBL作爲選擇ID1,ID2,... ...從UNION選擇ID2爲ID1,ID1爲ID2,... FROM ...

體面系統不應該懲罰你查詢此視圖時的性能區域。