2009-05-17 165 views
3

我就需要存儲有關各種建築物的信息,並存儲取決於建築的類型,不同類型的信息PHP項目的工作:擴展類數據庫

的建築類將是通過類,比如,衆議院和Office這樣的類看起來像這樣(只是一個例子)

Class House Extends Building { 
    var $numRooms; 
    var $numBathrooms; 
} 

Class Office extends Building { 
    var $offices; 
    var $sqfoot; 
} 

的問題是,如何把這個數據庫中表示(使用MySQL IM,如果它事項)擴展。我是否應該使用建築物表格來存儲位置和名稱,然後爲每個其他類別創建一個表格來存放「擴展」變量?或者我爲每個班級創建一個表格?或者建築物表格是否應該包含所有其他類別變量的列?

+0

這是作爲(我的)重複[http://stackoverflow.com/questions/836383/how-do-i-represent-object-classification-hierarchy-in-a-rdbms](http://stackoverflow .com/questions/836383/how-do-i-represent-object-classification-hierarchy-in-a-rdbms) 檢查那裏的答案。 – 2009-05-17 18:29:10

回答

2

我強烈建議您將Class Table Inheritance模式看作由Martin Fowler定義。

此設計模式創建一個表,其中包含所有建築物通用的數據,然後需要一個單獨的表來處理與特定類型建築物相關的任何數據。有一件事我覺得很有幫助,就是在父表中存儲一個'type'字段,這樣你就可以知道你有什麼類型的實體,而不必在子表中搜索對應的記錄。

我會建議,除非你有一個非常明確,明確的理由來使用實體屬性設計,你避免它。一方面,使用這種類型的設計利用數據庫上的約束來控制需要什麼輸入以及允許哪些類型的值時,變得不可能。另一方面,由於存儲在這些字段中的數據不能像您通常那樣編入索引,因此會大大減慢需要從這些類型的字段中提取數據的查詢。

1

如果想法不是使用一堆表和字段複雜化事情,我會簡單地爲Building創建一個表,然後爲這些數據添加兩個字段,其中一個可以定義建築物的類型(即:房屋,辦公室等等......)另一個是擴展類對象數據的序列化。

但我認爲做到這一點的最好方法實際上取決於您需要對數據庫進行的查詢類型。例如,如果您需要查詢數據庫以選擇「$ numRooms> 5」的所有「房屋」,則序列化可能不是最佳選項...