2017-06-23 3 views
1

Ich habe eine Datenbank gegeben, die kontinuierlich durch einen automatischen Import gefüllt wird. Daher kann ich die Datenbankstruktur nicht ändern und muss das Doctrine-Modell um die Datenbank herum erstellen. Daher habe ich dafür ein Modell erstellt und die meisten Dinge funktionieren in meinem Quellcode gut, vor allem aber nicht für die folgenden Tabellen.Symfony + Doctrine Probleme mit der Modellierung der angegebenen Datenbank

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 
... 

Lehre wurde Erzeugung eine Eins-zu-Eins-Abbildung, beispielsweise zwischen dem Gerät und der RAM-Tabelle, was falsch ist, denke ich. Das Problem ist, teilen die Tabellen den Primärschlüssel (DeviceId). Wenn es also ein Gerät mit der ID 1 in der Gerätetabelle gibt, gibt es auch ein Dataset in der RAM-Tabelle, wenn der Gerätetyp "RAM" ist (definiert in der Tabelle deviceType). ID 2 ist beispielsweise ein Prozessor, also gibt es einen Eintrag im Gerät und im Prozessor, beide mit der ID 2. Und so weiter ... Ein Datensatzeintrag in der Gerätetabelle hat immer einen Gerätetyp, der in der Gerätetyptabelle definiert ist.

Ich bin nicht der Datenbankspezialist, aber ist das nicht wirklich eine Beziehung zwischen mir und einer Eins-zu-eins-Zuordnung? Wie kann ich die Subtypen von Gerät (RAM, Prozessor) der übergeordneten Tabelle in Doctrine zuordnen?

Nach googlen, ich denke, eine einzelne Tabelle Vererbung ist was ich suche, aber ich weiß nicht, ob Doctrine kann mein Datenbankmodell richtig umgehen, weil das einzige, was die Subtypen (RAM, Prozessor ...) teilen mit der Elternklasse (Gerät) ist das ID-Feld. Alle anderen Felder sind für jede Tabelle sehr unterschiedlich.

Es ist wirklich wichtig, dass Doctrine die Struktur meiner Datenbank nicht berührt, weil der Import nicht mehr funktioniert.

Irgendwelche Ideen?

Vielen Dank.

Antwort

0

Ok, ich fand heraus, dass der Simple Derived Identity Anwendungsfall von http://doctrine-orm.readthedocs.io/en/stable/tutorials/composite-primary-keys.html wahrscheinlich zu mir passt. Bleiben wir beim Beispiel auf der Seite: Die Richtung von der Beispiel-Benutzerklasse zur Adressklasse ist ziemlich einfach. Aber wenn ich die Rückseite erreichen möchte (bekomme die Adresse vom Benutzer), sollte ich einfach das Feld "Adresse" zur Benutzerklasse hinzufügen. Aber wenn ich das tue, will Doktrin meiner Benutzerklasse einen Fremdschlüssel hinzufügen. Das wird das Datenbankmodell ändern, was ich nicht will. In meiner realen Datenbank gibt es keinen Fremdschlüssel von der Elternklasse (Gerät) zu der Kindklasse (z. B. Prozessor).

Irgendwelche Ideen?

+0

Ich glaube nicht, dass es möglich ist, ohne die vorhandene Datenbank aufgrund seines "schlechten Designs" zu ändern. Wenn Sie den Importvorgang nicht mit einem leicht geänderten Schema aktualisieren können, versuchen Sie es mit der automatisch generierten Zuordnung und implementieren Sie die erforderlichen Funktionen, um die Objekte in einem benutzerdefinierten Repository abzurufen. – lordrhodos

+0

Ok, ich habe es versucht und versucht, das Doktrinmodell zu aktualisieren, jetzt bekomme ich Verletzungen der Integrität, wenn die Doktrin einen neuen Fremdschlüssel setzt ... –

Verwandte Themen