2016-07-17 40 views
1

我需要從m表拿到最後n記錄(可以說m = n =〜10現在)按日期排序(也支持抵消會很好)。這應該向用戶展示他最後的活動。這些表格將包含該用戶的大部分數百或數千條記錄。 我該如何做到最有效的方式?我正在使用Doctrine 2,這些表格沒有任何關係。高效的方式來獲得按日期排序多個表最後n條記錄(用戶活動日誌)

我雖然對一些解決方案,不知道什麼最好的方法:

  1. 創建單獨的表,並把記錄在那裏。如果發生任何更改(如果用戶在系統內部進行任何應該在日誌表中顯示的更改),它將被插入到此表中。這應該是非常快的,但它很難管理,我不想使用這種方法。
  2. 獲取每張表的最後n記錄,然後對它們進行排序(超出數據庫)並限制爲n。這似乎很簡單,但有了更多的表格,會有很高的開銷。對於10個表格,90%的記錄將被丟棄。如果使用偏移量,則會更糟糕。這也意味着m查詢。
  3. 創建單個本機查詢並獲​​取最後n項目的所有表的聯合的idtype項目。像SELECT id, date, type FROM (SELECT a.id, a.date, 'a' AS type FROM a ORDER BY a.date DESC LIMIT 10 UNION b.id, b.date, 'b' AS type ORDER BY b.date DESC LIMIT 10) ORDER BY date DESC LIMIT 10。然後創建最多m查詢獲取這些實體。這應該比2.更好一些,但需要原生查詢。

是否有任何其他方式如何獲取這些記錄?

謝謝

+1

爲什麼有m個表格而不是1個? – Strawberry

+0

好吧,可以說有一個表購買和討論。我想顯示第一條記錄爲'您在下午3點購買了',第二條'您在下午2點做了評論',第三條'您在下午1點發表了評論'並提供了一些詳細信息 –

回答

0
  1. 是不是很難管理,它僅僅是一個額外的插入每個插入你正在做的「動作」 -tables。

你也可以通過使用我猜想的觸發器來解決這個問題,所以你甚至不需要在應用程序代碼中實現它。 https://stackoverflow.com/a/4754333/3595565

  • 那豈不是「從每個這些表的特定用戶獲得最後n記錄嗎?所以不要看到很多的問題,這種做法,雖然我還認爲這是處理事情的至少理想的方式

  • 會像第二個選項,但數據庫處理,這使得這種方法有很多更可行的排序

  • 結論: (基於意見)

    您應該在選項1和3之間進行選擇。主要的問題應該是

    • 是確定存儲冗餘數據

    • 是確定有邏輯的應用程序之外,你的數據庫內(觸發)

    使用日誌記錄表會讓事情變得非常簡單。但是你會複製數據。

    如果您可以使用觸發器來填充日誌記錄表,事情會更簡單,但它有缺點,因爲它需要額外的文檔等,所以沒人想知道「數據來自哪裏?」

    +0

    另外,代替觸發器,op可以使用一個主表和多個意見 –

    相關問題