2014-10-09 16 views
0

我有一個應用程序,我根據自己的位置搜索用戶,最近活動,以及其他一些過濾器,並且現在已經到了一個地步,表現不由於用戶數量的增加,這一點已經足夠好了,但必須改進。但是,林不知道什麼是最好的前進方向,並會感激任何投入!如何擴展人際關係查詢地理空間/一個火種一樣後端系統

我的基本設置是兩張表,讓他們打電話給他們的用戶和關係。每個用戶都有一些屬性,例如位置,last_activity和各種屬性。每個用戶可以與另一個用戶(朋友/敵人)有關係。

我想要做的(這是重做)的查詢搜索附近的用戶實現了許多用戶尚未有一個關係的屬性。然後,用戶將遍歷列表並將關係添加到列表中的每個用戶。完成後查詢另一個列表並重復。

眼下它在PostgreSQL的實現在PostGIS對地理指標,但它是不可擴展。

僞PSQL:

CREATE TABLE users 
(
    id serial NOT NULL, 
    location geometry, 
    last_active timestamp NOT NULL, 
    property1 int NOT NULL 
) 

CREATE TABLE relations 
(
    user_id int NOT NULL, 
    other_user_id int NOT NULL, 
    relation_type char(1) NOT NULL 
) 

和查詢

nearby := SELECT * FROM users 
    WHERE property1 > 1 
    ORDER BY location <-> 'my location'::geometry 
    LIMIT 1000 

SELECT * FROM nearby u 
    WHERE NOT EXISTS (SELECT * FROM relations where user_id = u.id) 
    AND radius > ST_Distance(location::geography, 'my location'::geography) 
    ORDER BY ST_Distance(location::geography, 'my location'::geography) * (current_timespan - last_active) 

查詢被分成兩個,以確保第一部分是使用上的位置的地理指標。只要將其限制在一個合理的小數字(如1000)上,它就可以正常工作。當第一部分返回的所有用戶在第二部分中被過濾掉時,問題就會出現。

任何建議,如何重新設計這個系統,使其支持數百萬用戶提供了數億的關係?

整個系統非常相似,火種必須做,找到用戶您還沒有互動與和一個數字,如年齡和性別屬性的排序上的活動時間,地點和篩選器列表。

回答

3

您可以嘗試加權加權的voronoi圖。在awvd中,重量是從euklidian距離中減去的。也許你可以使用每個半徑作爲「重量」,然後創建vd。較大的半徑會使較小的單元格變形,但它也傾向於使附近的點形成一個更大的單元格。你可以尋找例子爲stipple。它也使用加權voronoi圖!然後你可以嘗試一個多邊形點測試,但它很難解決。你可以在這裏閱讀關於voronoi圖:https://alastaira.wordpress.com/2011/04/25/nearest-neighbours-voronoi-diagrams-and-finding-your-nearest-sql-server-usergroup/

enter image description here

+0

我沒有完全按照如何將我的問題轉化爲此。你能否擴大你的答案?謝謝! – viblo 2014-10-21 02:41:11

+0

@viblo:Awvd有點類似於k-means。你也可以尋找尖頂。我認爲尖刺使用它。祝你好運! – Bytemain 2014-10-21 08:51:33

+0

我猜想Im掙扎着的是與關係一起在本質上是動態的過濾屬性。如果只是距離,或者只有關係會更容易。我不直接看到,如果我需要爲每個用戶單獨的圖(這將是太多) – viblo 2014-10-28 04:01:20