2010-09-27 62 views
3

我正在構建一個PHP/MySQL網站,我目前正在研究我的數據庫設計。我確實有一些數據庫和MySQL的經驗,但我從來沒有從頭開始構建一個真正的應用程序的數據庫,希望能獲得一些很好的流量,所以我很樂意聽到已經完成它的人的建議,以避免常見錯誤。我希望我的解釋不是太混亂。實現通用對象的數據庫結構

我需要

什麼在我的應用程序,用戶應該能夠寫個帖子(標題+文字),然後創建一個「對象」(可以是任何東西,如視頻,或歌曲等)並將其附加到帖子中。該網站有用戶可以創建的預定義對象類型的列表,我將來可以添加新的類型。用戶還應該能夠在專用頁面中查看對象的詳細信息併爲其添加註釋 - 這同樣適用於帖子。

我試過

我創建了一個objects表這些字段:oidtypenamedate。此表包含用戶應該能夠添加註釋的任何內容(即帖子和對象)的記錄。然後我創建了一個postmeta表,其中包含關於「視頻」對象(URL,描述等)數據的附加發布數據(如文本,作者,上次編輯日期等),videometa表。 A postobject表(pid,oid)將對象鏈接到帖子。此外,還有一個comments表,其中包含註釋文本,作者和它所引用的對象的ID。

由於對象類型的列表是預定義的,並且可能不會改變(雖然我仍然需要能夠隨時添加類型而無需更改應用程序的代碼結構或數據庫設計),而且它相對較小,爲每種類型創建一個「元」表並不是一個問題,並在我的應用程序中創建相應的PHP類來處理它。

最後,網站上的一個頁面需要顯示所有帖子的列表,包括附加到它的對象,按日期排序。因此,我從objects表中獲取「post」類型的所有記錄,並使用postmeta加入以獲取後期元數據。然後,我查詢postobject以獲得附加到該帖子的所有對象,並且獲得所有評論。

的問題

這是否任何意義?以這種方式爲真實世界的網站設計數據庫有什麼好處?我需要加入相當多的表來獲取我需要的所有數據,而且由於它幾乎包含每個項目(只有類型,名稱和創建日期),因此表將變得很龐大 - 這是爲了保留數據庫而且應用程序代碼是靈活的,但它在現實世界中還是行得通,還是從長遠來看代價太高?我是用這種OOP方法以錯誤的方式思考它的嗎?

更具體地說:假設我需要列出所有帖子,包括它們附加的對象和元數據。我需要加入這些表格,至少:posts,postmeta,postobject{$objecttype}meta(更不用說users表格可以獲取特定用戶的所有帖子)。即使我僅使用數字索引,我是否會得到糟糕的性能?

而且,我認爲使用的NoSQL數據庫(MongoDB的)這個項目(感謝司徒埃利斯的建議)。顯然它似乎更合適,因爲我需要一些靈活性。但是我的疑問是:我的對象的元數據包含很多對數據庫中其他記錄的引用。那麼,如果我不能使用JOIN,我將如何避免數據重複?我應該使用DBRef和here描述的技術嗎?它們在性能方面與上述結構中使用的MySQL JOIN相比如何?

我希望這些問題確實有意義。這是我的第一個這樣的項目,我只想避免在啓動之前犯大錯,並發現我需要完全重新設計設計。

回答

2

我不是一個NoSQL的人,但我不知道是否這個特殊的情況下,實際上可能最好的文檔數據庫(MongoDB的或CouchDB的)處理。帶有元數據的各種類型的對象聽起來就像MongoDB的設計場景。

FWIW,你有一對夫婦的問題與你的表,後來可能會咬你的字段命名。例如,類型和日期是相當通用的,也是保留字。您還混合了單數和複數表名,這會引發任何自動對象映射。

無論您使用哪種數據庫,最好找到一組現有的數據庫命名約定並從頭開始應用 - 這將幫助您避免細微問題並確保命名保持一致。我傾向於使用Rails命名約定的ATM,因爲它們是衆所周知且相當明智的。

+0

我更新了第一篇關於NoSQL的問題,謝謝。 – pt2ph8 2010-09-29 08:40:16

0

或者如果您關心數據庫空間,則可以將對象內容作爲文件存儲在數據庫之外。

如果您存儲任何東西在數據庫中,你已經在objects對象類型;所以你可以添加object_contents表與長二進制字段來存儲對象。您不需要爲每個新類型創建一個新表。

+0

我應該說明我並不需要存儲實際的視頻或歌曲文件,而是元數據只包含字符串和整數,這就是爲什麼帶有這些額外數據的表格聽起來更加自然。 – pt2ph8 2010-09-27 18:40:34

0

我在真實世界的Web應用程序中看到了很多JOIN(5到10)。對象表可能會變大,但這是索引。到目前爲止,我沒有看到數據庫中有任何錯誤。順便說一句,我覺得很奇怪 - 一篇文章,一篇文章,還有每篇文章的評論都不一樣?無法將圖片與文字混合?