2011-08-25 22 views
0

我對我的SQL超級生鏽,我想確保我不寫任何在任何類型的負載下都會失敗的東西。更好的SQL拉線程和消息?

我有一個單一的信息表,看起來像這樣:

ID int [PK] 
ThreadId nvarchar(32) 
Read bit 
Archived bit 
Timestamp datetime 
/*---Other non-relevant columns---*/ 
Sender_MemberId int [FK] 
Receiver_MemberId int [FK] 

到Gmail類似,我希望能夠按正常短信用來把所有的線程,該線程的所有消息(收件箱,發送,存檔等)。

這裏是我目前使用的收件箱中的SQL:

SELECT * FROM [Messages] 
WHERE [ThreadId] IN 
(
    SELECT [ThreadId] 
    FROM [Messages] 
    WHERE ([Receiver_MemberId] = @MemberId) 
) 
ORDER BY [ThreadId] DESC, [Timestamp] DESC 

這個工程,我想,但有一個更好的方式來做到這一點?如果不是,我應該有什麼指數?

更新:每個亞倫的好建議,我已經添加了分頁,並減少了信息的數量,我馬上就拉開了蝙蝠。

新的SQL:

SELECT DISTINCT m.[ThreadId], m.[Subject], m.[To], m.[From], m.[Timestamp] 
FROM 
( 
    SELECT ROW_NUMBER() OVER (ORDER BY MessageId) AS RowNumber , ThreadId 
    FROM [Messages] 
    WHERE [Sender_MemberId] = @p1 
) 
AS t 
INNER JOIN [Messages] m ON m.ThreadId = t.ThreadId 
WHERE t.RowNumber BETWEEN @Skip + 1 AND @Skip + @Take 
ORDER BY [Timestamp] DESC 
+1

您是否真的需要將所有線程和所有消息放在一起?我會說,一般來說,你需要拉出所有的線程標題(也許是消息的計數),但不要「鑽入」,直到他們選擇一個線程,然後你去獲得該線程的所有消息。如果你得到所有的線程和所有的消息,那麼你可以從Google的方法中採取另一種策略:分頁(例如,一次50個線程,而不是所有線程)。 –

+0

亞倫,好點都好。我曾計劃在稍後添加分頁,但現在意識到我需要從一開始就添加分頁。就一次性獲取所有消息而言,我將把它們放入緩存中,但這可能不是最好的方式。我會再考慮一下。 – Dave

+0

如果您的網站處於活動狀態,您希望您的緩存有效多久?如果該網站很受歡迎,您預計您的緩存有多大? –

回答

1

你並不需要一個子查詢,這應該做

  SELECT Id 
     , [ThreadId] 
     , read 
     , archived 
     , timestamp 
  FROM [Messages] 
  WHERE [Receiver_MemberId] = @MemberId 
    ORDER BY [ThreadId] DESC, [Timestamp] DESC 

這是很好的做法來命名你需要的列,而不是使用*

+1

*你需要以threadid命令嗎?*可能。大多數網站顯示線程列表,然後展開並查看該線程下的所有消息。如果您通過時間戳命令,您可以從線程1發送消息,然後從線程12發送消息,然後從線程24發送消息,然後從線程1發送另一個消息... –

+0

好點的亞倫,會相應地修改響應 –