我正在構建一個PHP/MySQL網站,我目前正在研究我的數據庫設計。我確實有一些數據庫和MySQL的經驗,但我從來沒有從頭開始構建一個真正的應用程序的數據庫,希望能獲得一些很好的流量,所以我很樂意聽到已經完成它的人的建議,以避免常見錯誤。我希望我的解釋不是太混亂。實現通用對象的數據庫結構
我需要
什麼在我的應用程序,用戶應該能夠寫個帖子(標題+文字),然後創建一個「對象」(可以是任何東西,如視頻,或歌曲等)並將其附加到帖子中。該網站有用戶可以創建的預定義對象類型的列表,我將來可以添加新的類型。用戶還應該能夠在專用頁面中查看對象的詳細信息併爲其添加註釋 - 這同樣適用於帖子。
我試過
我創建了一個objects
表這些字段:oid
,type
,name
和date
。此表包含用戶應該能夠添加註釋的任何內容(即帖子和對象)的記錄。然後我創建了一個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
相比如何?
我希望這些問題確實有意義。這是我的第一個這樣的項目,我只想避免在啓動之前犯大錯,並發現我需要完全重新設計設計。
我更新了第一篇關於NoSQL的問題,謝謝。 – pt2ph8 2010-09-29 08:40:16