2010-04-05 18 views
0

我正在創建數據庫結構。我必須存儲ingoing和傳出的消息,我想知道這是做到這一點的最佳方式。使用兩個表而不是具有2個不同值的列的優點

與ENUM('in','out')列中的2個分開的表或相同的表?

有什麼建議嗎?

謝謝。

+0

什麼樣的信息?你有什麼其他的細節存儲在你的桌子上? – 2010-04-05 14:11:19

+0

text和user_id,很簡單,是否有理由更喜歡存儲在同一個表中? 性能呢? – Dario 2010-04-05 14:18:04

回答

0

由於消息是非常相同的對象,因此應包括box_id作爲boxes表的參考。這將幫助您不僅在收件箱/發件箱中存儲郵件,而且還可以在垃圾郵件,草稿和其他「文件夾」中存儲您可能會想到的郵件。

否則,您可以有多對多的關係,並在幾個框中存儲相同的消息(就像gmail標籤一樣)。

0

如果90%的列相同,請使用一個表。

僞SQL:

TABLE messages 
    id INT 
    subject STRING 
    direction ENUM 
INDEX direction 
0

,如果他們訪問/由獨立的過程管理,我建議單獨的表。如果同一個進程管理兩種類型的消息,則使用同一個表。

0

一張桌子是最好的解決方案。

通常任何給定的數據實體都應該存儲在一個表中。在這種情況下,消息是您的數據實體。

作爲一個方面點我建議不要在表中使用枚舉的 - 在這種情況下,消息將屬於傳入或傳出 - 這樣的消息方向應與約束被存儲在一個單獨的表,以確保他們是有效的。

另外方向可能是一個誤人,你可能希望打電話&出文件夾或位置或框(如@Eimantas指出)。

0

如果是同一站點/應用程序的用戶之間的消息的消息傳遞系統,則可以簡單地使用1個表,其中senderIdrecipientId。收件箱是用戶ID匹配recipientId的郵件,其中用戶ID匹配senderId的發件箱。

請注意,這並不能很好地擴展到多個用戶的消息。在這種情況下,您需要一個單獨的表格,如Matt Allen所示。

1

如果您從其他用戶向用戶發送消息,我所做的是創建一個sent_message表和一個message_to_users表。

可能是你不想在任何時候正確地刪除一條消息,所以我只是把標誌放在那裏。

sent_message 
------------ 
sent_message_id 
from_id int 
subject varchar(128) 
body text 
status char(1) 
sent_datetime datetime 


message_to_user 
------- 
message_to_user_id int 
sent_message_id int 
to_id int 
read_datetime datetime 
status char(1) 

sent_message的地位將s(ent)d(eleted)併爲message_to_user的地位將a(rrived)r(ead),或d(eleted)

這種方法可以很容易地「全部回覆」功能,節省空間時,發送消息給多個用戶。

0

我認爲這取決於您是否想要一次查看所有消息。如果您的查詢要返回所有傳入的所有的傳出,但將它們全部傳回;那麼你會需要兩張桌子。特別是如果你最終在每個行中有很多行,那麼兩個表將是一個更快的解決方案。

+0

以及如果我想將它們全部歸還在一起,該怎麼辦? – Dario 2010-04-05 15:54:47

+0

然後你加入到第二個表格。 – HLGEM 2010-04-05 20:37:35

1

決定你的結構的一件事是,傳入和傳出的消息是否需要存儲關於它們的不同數據。如果他們這樣做,你可能需要單獨的表格。

另外,您通常會單獨請求它們,還是始終需要這兩種類型的查詢。

在做出決定時,您需要坐下來決定需要存儲的每種類型的數據以及如何查詢數據。這將最終決定你的結構。在典型的消息處理中,您可能會有許多記錄,並且考慮到該設計將有利於設計。我甚至可以用多組測試記錄來測試兩種方式,看看我的基本設計選擇會產生什麼影響。我知道人們談論的不是過早優化,但是一旦擁有數百萬條實際記錄,數據庫的基本結構就很難改變,現在用測試記錄來設置它是值得的,並且看看哪些可能性會起作用最好用你需要做的查詢類型(不要忘記用索引測試,因爲它們會產生巨大的性能差異)。這不是不成熟的優化,這是在嘗試糟糕的設計之前測試可能的負載,以及當用戶尖叫性能時無法重構。

0

如果消息實際上是相同的實體,只有一個屬性值不同,請使用單個表。如果您想在某些例程中使用子集,請創建單表視圖以僅獲取入站或出站消息。

如果這些消息是不同的實體,特別是如果它們針對不同的userid組進行驗證,則需要兩個表。

相關問題