2015-11-14 98 views
1

數據庫表articles包含10.000行(文章) 我想獲得一篇隨機文章,將其標記爲已讀且永不再讀取, 因此,我的下一個獲取請求應該返回除了那一個之外的隨機文章。 有成千上萬的像我這樣的用戶,他們都在使用這張表。如何獲取隨機未讀文章?

我該如何實施?如何標記這些文章,以及如何僅搜索未讀文章?

我正試圖在Articles表中創建relatedUsers列,該表填寫了關係到已閱讀文章的用戶對象的關係。我正在使用搜索查詢:relatedUsers.objectId!=currentUserId但是,當此列獲得2+ relatedUsers時,此解決方案停止工作,因爲數據庫返回文章,其中至少有一個relatedUser,objectId不等於currentUserId(表示所有用戶)。

我現在正在使用Backendless.com,但如果我猜測,解決方案應適用於任何數據庫,包括後端。如果不是,那麼我應該使用什麼樣的數據庫?

+1

有沒有關於sql server的信息。 Microsoft SQL Server? MySql? 請給出完整的當前查詢請求,不僅「relatedUsers.objectId!= currentUserId」 –

+1

您需要另一個表,稱爲「UserArticles」,每個用戶和每篇文章有一行。 –

+0

安德烈Rybalkin,如果你知道如何解決這個與一些特定的數據庫 - 在你的答案中使用它,我願意切換到任何人。 – stkvtflw

回答

1

獲取一個隨機數取決於數據庫。但基本的想法是有一個名爲UserArticles的表,每個用戶和每篇文章已經閱讀了一行(可能還有其他信息,如時間)。

然後,你可以這樣做:

select a.* 
from articles a 
where not exists (select 1 
        from userarticles ua 
        where a.article_id = ua.article_id and ua.user_id = $user_id 
       ) 
order by rand() 
limit 1; 

order by rand() limit 1絕對是依賴於數據庫。但是,它給了你如何解決問題的想法。

一旦你選擇的文章,那麼您將這一信息納入UserArticles

insert into UserArticles(user_id, article_id) 
    values ($user_id, $article_id); 

其中$article_id指的是在上一步中檢索到的文章。

注意:對於競態條件,這應該沒問題,除非單個用戶可以有多個同時連接到數據庫的請求相同的信息。處理這種情況需要更多關於正在使用的數據庫的知識。

+0

他使用Backendless.com。有特定的限制lang。它不是sql數據庫 –

+1

實際上,它是sql數據庫,可以使用類似於SQL的where-clause:https://backendless.com/documentation/data/rest/data_search_and_query.htm – Scadge

2

你現在可以做的是:

  1. 創建帶有字段articleIduserId
  2. 當您添加用戶或文章名爲UserArticle表,你也應該加入到這個表關係到所有文章或用戶分別;這樣您UserArticle表將包含文章和用戶之間的關係誰尚未讀過這些文章
  3. 而爲了獲取用戶的隨機讀不懂文章,您:
    1. UserArticle其中userId = yourCurrentUserId檢索項
    2. 隨機
    3. 選擇它們中的一個,並通過它的ID
    4. 檢索的物品通過articleIduserId取下UserArticle所選物品,這意味着用戶已閱讀文章

這種方法是最適合您的情況。它涉及多一點的要求,但現在你的要求不可能更好。

此外,我們(後端團隊)正在處理關鍵字contains,使用該關鍵字,您只能與用戶表關聯,並且不會在一個請求中閱讀文章,因此建議的方法非常臨時。

+0

對於步驟3.1,您可以添加一些「通過在檢索對象集合時分配隨機偏移量來實現「隨機性」。 –

+0

..但請注意,如果您的偏移量恰好大於找到的集合的大小,您將收到一個空集合 – Scadge