2011-02-15 80 views
4

我對mysql比較陌生,想知道存儲某些東西的最佳結構。不同的論壇似乎給出了不同的建議。SQL數據庫的高效設計

想象我試圖創建自己的webmail serivce,我將有一個用戶表:

|userid|username|password|joindate| 

如果我想存儲在一個表中的每個用戶的電子郵件,我會怎麼做呢?一個解決方案,我發現是有一個emails表並執行以下操作:

+------+--------------+---------------+ 
|userid|subject  |message  | 
+------+--------------+---------------+ 
|1  |Hello   |some message | 
|1  |Another email |another message| 
|2  |An email for 2|message  | 
+------+--------------+---------------+ 

即該表將包含屬於每一個用戶的每一個電子郵件。這似乎過於繁瑣,是否有一個優雅的方式呢?

+6

*提醒* *提醒*確保`password`實際上不是用戶的明文密碼 – 2011-02-15 23:54:29

+0

我不能強調丹尼爾的評論就好了。如果這比僅僅學習如何使用mysql或學校項目更重要,那麼你需要某種形式的散列。 – corsiKa 2011-02-15 23:57:45

回答

0

首先,很好的問題。你在思考並詢問這個問題非常好,而不是提前收費,並且做出在現實世界中迅速崩潰的事情。當然,如果這是你的第一個數據庫,那麼無論如何你可能會得到這種結果,這就是通常的學習方式。我們都寫了一些可怕的意大利麪代碼,但專業人士和業餘愛好者之間的差異正在從痛苦中吸取教訓,並投入努力在下一次做出更好的解決方案。

對於你的問題沒有簡單的答案,其他人提出了重要的觀點。我想補充一點:拿一本關於規範化的小書(我用O'Reilly的「Nutshell」系列獲得了很好的結果)。這聽起來像是一個很大的話題,但要點很簡單:任何特定的信息都只存儲一次。這樣可以節省空間,但更重要的是,您永遠不會將用戶名稱存儲在不同的表中。

試着想想大局,太:不僅你現在需要的是什麼,但你可能合理需要在未來,諸如基思指出CC場。一封郵件可以有多個目的地,因此而不是ToCC在你EMails表中的字段,一個強大的設計將有EMailDestinations表的字段EMailIDDestinationDestinationType。這已經是一個更具可擴展性的設計的例子:使用這個模型,您可以開始追蹤BCC,只需一個DestinationType。但是,如果你能確定電子郵件只有一個目的地,那麼也許這對你的項目來說是過度工程。重要的是要考慮所有的可能性,即使你最終得到一個簡單的設計足以滿足你的需求。

祝你好運!不要猶豫,在未來回答問題。如果你有一個明確而具體的問題,你通常會很快得到答案。

1

這是優雅的方式。它允許你做這樣的事情:

SELECT * 
FROM email 
WHERE email.userid = $userToSearchFor 
3

我是比較新的MySQL和被 想知道的最佳結構 存儲的東西。

定義 「最佳」。

什麼數據庫結構可能是「最優」是嚴重依賴於上下文。

最適合什麼?插入,選擇?使用什麼選擇標準,加入,訂購等。

此表格將包含屬於每個單一用戶的每一個 電子郵件。 這似乎過於繁瑣,有沒有 一個優雅的方式呢?

你到底找什麼麻煩的?這是如此簡單。 ?

1

這是關係數據的理想之處,就是相同的數據存儲在一張表中。

然後,該數據可以與其他數據有關係。

即你的情況下你的數據與用戶(通過用戶ID)有關係。所有用戶都存儲在一張表中,所有電子郵件都存儲在一張表中。

你可能有一個像如果電子郵件抄送或發送至多人更復雜的關係。然後,您可能需要另一個表來處理用戶和電子郵件之間的映射。

您probablly想在你的電子郵件表的日期,以及主ID,這樣你可以從另一個表中特定的電子郵件的關係。

0

老實說,我認爲這取決於你正在創建的服務。

這是完全可以接受的使用一個電子郵件地址作爲自用戶名,顧名思義,它必須是唯一的。在這種情況下,我認爲它絕對屬於用戶關係。

對於您的示例,爲每個用戶存儲多個電子郵件,您提供的解決方案應該很好。