2017-06-23 76 views
1

我給出了一個數據庫,它將不斷被自動導入填充。所以我不能改變數據庫結構,不得不圍繞數據庫建立Doctrine模型。因此,我爲此生成了一個模型,並且大多數情況在我的源代碼中都能正常工作,但是對於下面的表格尤其如此。建模給定數據庫的Symfony + Doctrine問題

Table Device 
---------- 
deviceId (pk) 
name 
deviceType (fk to DeviceType) 
... 

Table Processor 
----------- 
deviceId (pk) 
ProcessorName 
Clockspeed 
... 

Table RAM 
----------- 
deviceId (pk) 
Size 
Manufacturer 
... 

Table DeviceType 
------------ 
deviceTypeId(pk) 
DeviceType 
... 

學說正在生成一對一的映射,例如,在設備和RAM表之間,我認爲出了什麼問題。 問題是,表共享主鍵(DeviceId)。因此,如果設備表中存在ID爲1的設備,則如果deviceType是'RAM'(在deviceType表中定義),那麼RAM表中還有一個數據集。 ID 2例如是一個處理器,所以在設備和處理器中都有一個條目,都帶有ID 2.等等......設備表中的數據集條目總是有一個設備類型,在deviceType表中定義。

我不是數據庫專家,但實際上並不是一個is-a-relation而不是一對一映射嗎?如何在Doctrine中映射適合父表的設備的子類型(RAM,Processor)?我認爲單個表繼承是我正在尋找的,但我不知道是否Doctrine可以處理我的數據庫模型,因爲唯一的子類型(RAM,Processor ...)共享與父類(設備)是id字段。每個表格的其他所有字段都不相同。

它真的很重要,Doctrine不會觸及我的數據庫的結構,因爲導入不再工作。

任何想法?

謝謝。

回答

0

好的,我發現,從http://doctrine-orm.readthedocs.io/en/stable/tutorials/composite-primary-keys.html簡單派生的身份用例可能適合我。讓我堅持頁面上的示例:從示例用戶類到地址類的方向非常簡單。但是,如果我想實現反面(從用戶獲得地址),我應該簡單地將字段「地址」添加到用戶類。但是,如果我這樣做,教條要爲我的用戶類添加一個外鍵。這將改變數據庫模型,我不想要的。在我的真實數據庫中沒有從父類(設備)到子類(例如處理器)的外鍵。

任何想法?

+0

由於「壞設計」,我認爲不改變現有數據庫是不可能的。如果無法更新匹配稍微更改的模式的導入過程,請嘗試使用自動生成的映射並實現所需的函數以檢索自定義存儲庫中的對象。 – lordrhodos

+0

好吧,我試了一下,試圖更新教義模型,現在我得到完整性違反,如果教條設置一個新的外鍵... –