我正在創建數據庫結構。我必須存儲ingoing和傳出的消息,我想知道這是做到這一點的最佳方式。使用兩個表而不是具有2個不同值的列的優點
與ENUM('in','out')列中的2個分開的表或相同的表?
有什麼建議嗎?
謝謝。
我正在創建數據庫結構。我必須存儲ingoing和傳出的消息,我想知道這是做到這一點的最佳方式。使用兩個表而不是具有2個不同值的列的優點
與ENUM('in','out')列中的2個分開的表或相同的表?
有什麼建議嗎?
謝謝。
由於消息是非常相同的對象,因此應包括box_id
作爲boxes
表的參考。這將幫助您不僅在收件箱/發件箱中存儲郵件,而且還可以在垃圾郵件,草稿和其他「文件夾」中存儲您可能會想到的郵件。
否則,您可以有多對多的關係,並在幾個框中存儲相同的消息(就像gmail標籤一樣)。
如果90%的列相同,請使用一個表。
僞SQL:
TABLE messages
id INT
subject STRING
direction ENUM
INDEX direction
,如果他們訪問/由獨立的過程管理,我建議單獨的表。如果同一個進程管理兩種類型的消息,則使用同一個表。
一張桌子是最好的解決方案。
通常任何給定的數據實體都應該存儲在一個表中。在這種情況下,消息是您的數據實體。
作爲一個方面點我建議不要在表中使用枚舉的 - 在這種情況下,消息將屬於傳入或傳出 - 這樣的消息方向應與約束被存儲在一個單獨的表,以確保他們是有效的。
另外方向可能是一個誤人,你可能希望打電話&出文件夾或位置或框(如@Eimantas指出)。
如果是同一站點/應用程序的用戶之間的消息的消息傳遞系統,則可以簡單地使用1個表,其中senderId
和recipientId
。收件箱是用戶ID匹配recipientId
的郵件,其中用戶ID匹配senderId
的發件箱。
請注意,這並不能很好地擴展到多個用戶的消息。在這種情況下,您需要一個單獨的表格,如Matt Allen所示。
如果您從其他用戶向用戶發送消息,我所做的是創建一個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)
這種方法可以很容易地「全部回覆」功能,節省空間時,發送消息給多個用戶。
決定你的結構的一件事是,傳入和傳出的消息是否需要存儲關於它們的不同數據。如果他們這樣做,你可能需要單獨的表格。
另外,您通常會單獨請求它們,還是始終需要這兩種類型的查詢。
在做出決定時,您需要坐下來決定需要存儲的每種類型的數據以及如何查詢數據。這將最終決定你的結構。在典型的消息處理中,您可能會有許多記錄,並且考慮到該設計將有利於設計。我甚至可以用多組測試記錄來測試兩種方式,看看我的基本設計選擇會產生什麼影響。我知道人們談論的不是過早優化,但是一旦擁有數百萬條實際記錄,數據庫的基本結構就很難改變,現在用測試記錄來設置它是值得的,並且看看哪些可能性會起作用最好用你需要做的查詢類型(不要忘記用索引測試,因爲它們會產生巨大的性能差異)。這不是不成熟的優化,這是在嘗試糟糕的設計之前測試可能的負載,以及當用戶尖叫性能時無法重構。
如果消息實際上是相同的實體,只有一個屬性值不同,請使用單個表。如果您想在某些例程中使用子集,請創建單表視圖以僅獲取入站或出站消息。
如果這些消息是不同的實體,特別是如果它們針對不同的userid組進行驗證,則需要兩個表。
什麼樣的信息?你有什麼其他的細節存儲在你的桌子上? – 2010-04-05 14:11:19
text和user_id,很簡單,是否有理由更喜歡存儲在同一個表中? 性能呢? – Dario 2010-04-05 14:18:04