2013-10-13 37 views
2

我正在使用mysql數據庫與PHP來構建一個Web應用程序。數據庫中的許多主表的常見子表

我有一個子表attachment,這是許多主桌的公共表:teacherstudentclassRoom(及其他)。 主表的數量超過10讓我們說n表。

我的問題的,它是一個很好的做法:

  1. 在數據庫中創建名爲「附件」只是一個表,並與它的主人有關它。
    這將導致在附件表中有n個外鍵(即:n-1個未使用的列),這些外鍵也將導致模型中的n-1個屬性,而不會在每次創建模型時進行初始化或使用。

  2. 爲每個稱爲(master_i_Attachment)的主表(master_i)創建一個表,並將其與主控關聯起來。但是這將導致n個附件表和n個模型用於我的代碼中的附件。

有什麼建議嗎?

+0

該表的用例是什麼? – Ashalynd

+0

附件表用於存儲(名稱,文件路徑,文件類型,文件大小,備註和其他詳細信息...)。 – mehsen

回答

1

你可以做的是隻有一個包含以下字段的表:id,reference_id(你的父表之一),reference_type(即reference_id屬於哪個表),(附件表中的所有其他字段)。然後,例如,如果要獲取特定父類型的附件,則可以對該類型執行SELECT查詢過濾,例如, WHERE reference_type ='教室'。

或者,如果你想獲得與特定的ID爲教室附件:

SELECT * FROM attachment WHERE reference_id=<ID> AND reference_type = 'classroom'; 

你可能會想有(REFERENCE_ID,reference_type),這將確保你不會複合唯一鍵不會得到重複的附件(除非您希望給定類型的給定ID具有多個附件的可能性,在這種情況下,該密鑰不應該是唯一的)。

此解決方案是否適合您的需求取決於您將如何使用數據,即您最常運行哪種查詢。

+0

您的解決方案很好,但我認爲這會影響數據的完整性。我需要外鍵將孩子與主人聯繫起來。所以我不能刪除主記錄,如果它有孩子 – mehsen

+0

你可以對觸發器做同樣的事情,但的確,你必須設置所有父表的觸發器。在這種情況下,您的選擇2可能是最佳選擇。 – Ashalynd

+0

如果我通過選擇#2。讓問題轉移到代碼中,代碼如何? 我想在模型類中使用一個模型來管理數據庫中的所有附件表,並使用類型屬性來區分它們。這是一個好習慣嗎? – mehsen

1

根據database normalization concept,不鼓勵在數據庫中使用冗餘和未初始化(或空值)值。實際上,規範化試圖越來越多地隔離數據(這意味着更多的表格適用於任何異常)。 但是您可以簡單地忽略規則或將數據庫非規範化以解決性能問題。在你的情況下,我認爲最簡單(和規範化)的方式是選擇編號#2(每個附件類型單獨的表格)。 Ashalynd說,但你可以調整你的設計。將type列放在您的表中以指定父表。順便說一句,使用這種方法會增加級聯數據庫更改的複雜性。

+0

如果我通過選擇#2。讓問題轉移到代碼中,代碼如何?我正在考慮創建一個模型來管理數據庫中的所有附件表,並在模型類中使用類型屬性來區分它們。這是一個好習慣嗎? – mehsen

+0

我不認爲這將是一個不變的程序中的問題。但是如果你想把它看作一個軟件工程問題,我認爲正確的方法是在代碼中使用面向對象的概念。例如,一個用於管理附件的抽象類,可以針對每種附件類型進行專門化(儘管這更復雜,將來可以輕鬆更改和擴展)。 –