2014-03-13 34 views
0

這是我的場景,我正在嘗試做更高效的工作。發送數組項目到服務器或在服務器端查詢它?

我有跟隨從100-5000跟隨者(更或小於分鐘以下的位)的陣列的用戶。用戶和追隨者數量本地存儲在用戶設備上(Android - sqlite)。選項A:當用戶想要看到他的追隨者時,我發送一個請求到要查詢的userId的服務器(node.js)(mongodb),然後向該用戶的追隨者數組中的所有用戶發送另一個查詢。

選項B:讓用戶以發送用戶ID和追隨者ID數組的請求,而只是做一個查詢服務器找到追隨者。 A的

效應:雙查詢(因爲跟隨陣列已經被查詢第一)B的

影響:連接可能會丟失和數據將不得不被重新發送,並且可以是大量的數據的立即發送,將不得不打電話POST/PUT反對GET(至少我認爲我是)。

因素: - 用戶體驗 - 優先級1個 - 服務器成本 - 優先級2

編輯

澄清:

這是指一個用戶,和他的追隨者。從登錄時發出的sqlite中,我將追隨者id存儲在行中。

+0

我(1)選項A 「他的追隨者」 困惑 - 他是誰在握着手機用戶?或電話持有人的追隨者名單中的一個用戶? (2)究竟存儲在SQLite數據庫中的是什麼?是所有追隨者的用戶ID列表嗎?或者只是一些追隨者? – Rarw

+0

首先,您是如何獲得設備上追隨者的ID的? –

+0

我在上面添加了說明......用戶拿着手機,以及所有userIds的列表(所以每個id都有一行)...... @Benito我在登錄時存儲它 – Lion789

回答

1

幹嘛還要送跟隨IDS擺在首位?

有在登錄響應發送所述從動IDS沒有意義的。

讓我們考慮這是當前的登錄響應:

{ 
    status:"success" 
    data: { 
      userId: "123456", 
      firstName: "John", 
      lastName: "Doe", 
      followers: [ "111111", "222222", "333333", ... ] 
     } 
} 

所以你保存跟隨IDS。現在你將如何使用它們?

你不能要求一個跟隨者的個人資料,因爲你沒有送的名稱,你就不會顯示用戶跟隨ID的列表來選擇,因爲他不知道,他們正在選擇哪個跟隨。

所以,你必須至少一個跟隨者的名字添加到每個ID,這將意味着一個非常大的反應,考慮到用戶最多可以有5000名追隨者。

這對於登錄API太多了,在我看來(即使沒有名字)。

或者,您可以發送關注者數量。

{ 
    status:"success" 
    data: { 
      userId: "123456", 
      firstName: "John", 
      lastName: "Doe", 
      followerCount: 2000 
     } 
} 

現在,當用戶決定去看他的追隨者,你可以送他的用戶ID(選項A),這足以對它們進行查詢。

我不熟悉面向文檔的數據庫,但我不認爲這樣的查詢會有任何性能問題。

爲什麼不選擇B選項?

  1. 如前所述,登錄API響應會非常大。
  2. 如果用戶追隨者在登錄和第二個API之間發生了變化,該怎麼辦?例如,您不會擁有新追隨者的用戶標識。建議

最後一條在你的反應實現服務器端分頁。

5000是一個相當大的數字。你的迴應將是巨大的,沒有分頁和一些設備可能沒有足夠的內存來存儲它。

下面是一個例子:

http://www.example.com/followers?userId=123456&pageSize=25

{ 
    status:"success" 
    data: { 
      followers: [ 
       { 
       userId: "----", 
       userName: "----", 
       firstName: "----", 
       lastName: "----", 
       ImageUrl: "----" 
       },  
       { 
       userId: "----", 
       userName: "----", 
       firstName: "----", 
       lastName: "----", 
       ImageUrl: "----" 
       }, 

      ...  
      ] 
      paging: { 
       page: 1, 
       pageSize: 25, 
       previous: "", 
       next:"http://www.example.com/followers?userId=123456&pageSize=25&page=2" 
      } 
     } 
} 
+0

謝謝偉大的職位,我保存ID以查看用戶(例如)是否會訪問另一個用戶的配置文件(B),我會請求查詢搜索(B),然後我會檢查是否(A)有(B)存儲在sqlitedb中的用戶標識 - 如果是的話,那麼他會跟着他,如果不是的話,那麼他可以跟隨他,並將它添加到他的人名單中,而不是在數據庫中查詢(B)和那麼(A)並且看看(B)的id是否與(A)的數組中的一個id的匹配列表匹配...然後每次用戶決定添加或刪除(B),我沒有繼續提出請求。 – Lion789

+0

但是,我想我可以只包含新的關注/取消關注,也許只是在<100個關注者/關注後才發送過來......我如何將頁碼與用戶數關聯起來? – Lion789

+1

關於您的第一條評論,當您請求其他用戶的個人資料時,您可以發送一個布爾值isFollower來指示該用戶是否爲追隨者。 –

1

爲了有效解決這個問題,我會實現一個你在mongodb和android設備中存儲的緩存鍵。每當一個人的追隨者改變時,緩存鍵就會重新生成。密鑰在MongoDB中進行索引以快速查找。

當我想看看我的一個追隨者時,我發送追隨者ID和緩存鍵。如果密鑰匹配,設備將擁有最新的數據,因此您可以發回「chache valid」響應。如果不匹配,則需要刷新設備。僅索引查找緩存鍵將非常快速。

+0

真棒,是的,我只是在想這個,唯一的不管我是否需要從MongoDB中獲取數據,因爲我只是在表中存儲用戶ID行(因爲它需要太多的空間來存儲每個用戶的縮略圖和信息) – Lion789

+0

所以我想也許只是發送緩存無論如何都知道是否需要刷新。 – Lion789

+0

如果我實際上記錄了用戶完成的操作更改...我不需要緩存鍵,因爲可以假定我有最新的數據,因爲無論如何我每天都會更新它,並且主要調用db – Lion789