2013-03-15 23 views
1

我有一個數據庫表,例如'items'。我有這些項目的時間表,按字段ascended_at(datetime)排序。我需要爲這樣的時間表做一個分頁API。所以,第一個我的版本是:按日期時間字段精確分頁

HTTP GET /items/timeline?page=[PAGE_NUM] 

它將觸發

SELECT * FROM items LIMIT 10 OFFSET [0, 10, 20, ...] ORDER BY ascended_at; 

,但現在的問題是:當有新郵件到達,每1個項目的所有頁面的變化。爲了避免這種情況,我已經添加from_asc_at參數:

HTTP GET /items/timeline?page=[PAGE_NUM]&from_asc_at=123123123 

它將觸發

SELECT * FROM items WHERE ascended_at <= [asc_at_parameter] LIMIT 10 OFFSET [0, 10, 20, ...] ORDER BY ascended_at; 

,但是這是不準確的,因爲它可能有兩個項目具有相同的ascended_at,你可以看到相同的項目在兩個不同的頁面(但不應該)。

所以,我的問題是:這有什麼可能的解決方案?

  • 使用ID(因爲它是唯一的)?但如果它不是通過ID命令呢?
  • 任何想法更多?

回答

0

如果您的物品ID是自動遞增的,您可以檢查第一次(分頁之前)檢索物品時將會是下一個「自動增量」值。

直到下次搜索時,將該值持久存儲(可能在會話變量中),併爲您的SQL查詢添加過濾器< {maximumID},以提高用戶分頁時的「結果集穩定性」(初始值搜索和分頁將不會被檢索)。

編輯

要處理項目缺失,你將不得不做「軟刪除」:不要立即刪除數據庫中的項目,而是存儲在一個日期時間字段刪除日期,這樣的項目仍然存在在DB一段時間。

發出新搜索時,您將在會話中存儲當前服務器時間,並添加一個條件(例如date_deleted IS NULL OR date_deleted > {searchDate}),以便在搜索後刪除的所有項目仍將顯示用於該特定搜索。

您將不得不創建一個計劃作業,以便在某些延遲後「真正」從數據庫中刪除項目。

+0

在我看來,它不處理刪除項目 – 2013-03-15 12:08:15

相關問題