2012-02-17 51 views
0

我在PHP中編寫了PHP中的兩個數據對象,它們非常相似,但應保存在兩個單獨的表中。因此,我將把它們編碼爲超類的子類。兩個類似結構化對象的數據庫設計

超類將保存大部分兩個類的重複函數,用於訪問數據庫表中的數據。每個類的特定功能/錯誤檢查/ DB訪問功能將在子類中實現。

我該如何在數據庫中實現這一點?我正在考慮超類的表的需要

設計一: TableA和TableB將引用TableSuperClass,並且所有通常結構化的數據都將鏈接到TableSuperClass而不是子類(TableA和TableB)本身。給TableA,TableB,TableSuperClass和CommonData。使用TableA和TableB存儲特定於A/B類的事物。

設計二: TableA和TableB將具有大部分相同的結構,每個具有幾個額外的列以滿足他們的特定需求。沒有超級班的桌子。 A和B共有的數據將存儲在兩個獨立的表中。所以基本上是表A,表B,表A,表B數據

這兩種設計的優點和缺點是什麼?

感謝

+0

在設計之一,爲什麼你有一個CommonData表?這不是TableSuperClass的一部分嗎?在設計二中,爲什麼你有TableAData和TableBData,如果它們是相同的,爲什麼不用CommonData或者是「這個記錄涉及到表A,id = 10」的組合鍵。最後,我認爲這取決於你的查詢的數據和性質 - 如果你能提供更多的信息,我們可以給你提供更好的指導。這兩種方式都可能有其優點 – Prescott 2012-02-17 04:19:27

+0

考慮閱讀關於數據庫對象繼承的Doctrine 2手冊:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/inheritance-mapping.html。不要說使用Doctrine 2,即使它非常酷。但我認爲這可能會給你一些好的想法,並且實際上討論你的兩種方法以及其他一些方法。 – Cerad 2012-02-17 04:23:47

回答

0

你引用的技術叫做數據庫多態性,有時類表繼承,否則這些方針。通常情況下,它是使用您的第一個設計實現的,但是有3個表格:具有公共列的公共表格和具有其自己的唯一列的每個「子類」的表格。這些通常是通過公共表中的類型列聯結在一起的,每個子類都將在代碼中定義它自己的類型值,並堅持只使用該值來對公共表和它的表進行聯接。