2011-05-30 55 views
3

我正在爲社交網站設計一個MySQL的消息/評論表。我有一個消息系統,參與兩個用戶(只有兩個,但不會超過)將具有單個/唯一的線程。因此,無論何時用戶正在給另一個用戶發送消息時,它都會檢查這兩個用戶是否具有唯一線程IF NOT,然後它將爲這兩個用戶創建唯一線程。如何在MySQL中設計消息/評論表?

create table comment_threads (
thread_id int (PK), 
user_id_1 int, 
user_id_2 int, 
created datetime 
); 

create table comments (
comment_id int (PK), 
thread_id int (FK), 
comment text, 
created datetime 
); 

每當用戶消息的另一用戶每次然後我要檢查兩個參與用戶是否曾有過線,所以我要在數據庫中查詢該(查詢1)。然後再次如果沒有任何線程在comment_thread中創建線程(QUERY 2)。然後再次在評論表中發佈評論(QUERY 3)。所以我必須查詢兩到三次消息。

問題:

  1. 是解決我的問題上表正確的方法,或者需要一些修正?
  2. 有沒有其他更好的方法來做到這一點?

回答

1

你並不真的需要有2個表.. 1個表應該是罰款:

create table comments (
comment_id int (PK), 
parent_id int, 
user_id_1 int, 
user_id_2 int, 
comment text, 
created datetime 
); 

對於一個新的線程,該PARENT_ID設置爲0。對於未來的評論,你可以設置parent_id添加到第一條評論的ID。

通過這種方式,您還可以進行多層次的線程對話,並且可以輕鬆執行「我已發佈的評論」等內容。

根據Itay的回答,您應該使用一些緩存機制來提高性能。

1
  1. 你無法知道哪些用戶離開其消息
  2. 當你實例化的消息系統線程,緩存兩個用戶ID和線程ID,無需運行到DB每個提交(這不是那麼簡單,而是你的方向,你將需要一些失敗的機制)
  3. 我會在內存中緩存線程並在稍後時間提交給數據庫(或者只是使用內存表)
  4. 由於這是一個只有兩個用戶,一個線程的唯一系統,所以你可以去規範化並在一個巨大的文本內完成一個記錄中的整個線程將最新條目連接到最後的字段。再次,這只是一個方向,而不是完整的解決方案。