2016-07-27 16 views
1

Entschuldigung für die Ungenauigkeit, aber ich bin verwirrt, wie man dieses Datenbankproblem beschreibt. Ein Teil davon ist ein Datenbank-Design-Problem, der andere Teil ist, wie man die Doctrine ORM und Symfony Form Builder-Engine dafür effizient verwendet. Lassen Sie mich versuchen zu erklären:Symfony/Doctrine: Variationen von Entitäten

Meine Datenbank enthält Reparaturen für Handys. Jede Reparatur ist nur für ein Mobiltelefon vorgesehen. Einige Handys haben jedoch unterschiedliche Farben. Während einige Reparaturen (wie Batteriewechsel) für alle Geräte gelten, haben einige (wie Display-Ersatz) unterschiedliche Preise abhängig von der Farbe des Geräts. Es sollte möglich sein, im Menü repair die Farbe jeder Reparatur anzugeben (wählen Sie eine, viele oder alle).

Mein aktueller DB-Design sieht wie folgt aus:

like this?

Aber das erlaubt mir nicht, die Farbe des Gerätes von der Reparatur Entity zugreifen zu können, wie Sie die Farbe eine direkte Beziehung zum Gerät hat, nicht zu reparieren. Also brauche ich eine komplexere Datenbank, die das iPhone immer noch als ein einzelnes Produkt behandelt, aber kann verschiedene Reparaturen zu seinen vielen Varianten sowie Karte Universalreparaturen zu alle Varianten zuordnen.

Sollte ich eine Join-Tabelle (repair_device_color) verwenden, die aus 3 IDs besteht? Scheint nicht hübsch. Und was ist der effizienteste Weg dies mit dem Doctrine ORM abzugleichen? Sollte ich Datenvererbung verwenden?

+1

Hallo bluppisk. Ich schlage vor, dass Sie sich mit dem [Entity-Relationship-Modell] (https://en.wikipedia.org/wiki/Entity%E2%80%93relationship_model) für Datenbanken vertraut machen und dann ein richtiges ER-Diagramm zeichnen - damit Sie werde verstehen, was du brauchst. Es gibt ein kostenloses [ERMaster-Plugin] (http://master.sourceforge.net/), das Sie in Eclipse (einer populären IDE) verwenden können, um ein Diagramm wie dieses zu erstellen. Schub mir das wird dir helfen. –

+0

Hallo Alvin, danke. Tatsächlich habe ich einen, und er besteht aus einer zweiten Viele-zu-Viele-Join-Tabelle, in der Gerät + Farbe mit einer Reparatur gepaart ist, aber ich weiß nicht, wie man es in Symfony abbildet. – bluppfisk

+0

Kannst du es irgendwo posten? Benutze vielleicht imgur und füge den Link zu deinem Beitrag hinzu. –

Antwort

0

auf einer realen Welt zu reparieren Szenario Je, wo man könnte die Farbe des Gerätes durch Änderung Körper ändern, Sie möchten vielleicht devices_colous_repairs statt einer Vereinigung zusätzliche 3-Einheit erhalten:

  1. device_attributes (Many-To -on mit Gerät)
  2. device_repair_attrbutes (Many-To-One mit Reparatur-IDs nur, wenn das Attribut in der Reparatur-Prozess geändert.
  3. Zusätzliche repair_billing Rechnung Kosten zu speichern, wie pro Standard/attrib ändern. (Many-To-One mit Repariere IDs mit optionalem Fremdschlüssel mit device_repair_attrbutes wo zutreffend.

Nur ein Vorschlag zur Normalisierung der Daten.

+0

Danke! Es wird jedoch nicht notwendig sein, die Farbe zu ändern. Worüber ich mich nun wundere ist, wie ich eine solche Dreiergruppe in symfony mapping definiere? – bluppfisk

+0

Die dritte Entität kann eine Verknüpfung mit anderen 2 Entitäten haben. Auf diese Weise können Sie Ihre Daten normalisieren und mit dem Preis verknüpfen. – Jeet

+0

also sollte ich zwei Ziel-Entitäten in der Mapping-Annotation setzen? Ich finde keine Online-Code-Beispiele, die eine Join-Tabelle mit drei Spalten erstellen. Oder sollte ich mit Tabellenvererbung oder etwas arbeiten? – bluppfisk

0

Ich wollte Ihnen eine gute Antwort geben, also brauchte ich ein bisschen Zeit, um meine Antwort zu erstellen. Dies ist vielleicht nicht perfekt, aber es wird Ihnen eine Idee geben. Das Digram, das Sie angegeben haben, ist übrigens kein ER-Diagramm.

Ich habe dies in Excel erstellt und kopiert und als Bild gespeichert. Die Tabellennamen und die ORM-Annotation sind wichtig.

Repairs Schema

Zum Beispiel finden Sie ein "Gerät" Entity mit dem Dateinamen als "src/AppBundle/Entity/Device.php" in üblichen Weise erstellen. Für die Arrays müssen Sie eine Funktion __construct() in der Entity-Klasse hinzufügen.

Als Beispiel ist es das, was der Code wie für die Geräte-Entity aussehen:

<?php 

// src/AppBundle/Entity/Device.php 
namespace AppBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="device") 
*/ 
class Device 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="device_id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $device_id; 

     /** 
    * @ORM\Column(name="model", type="string", unique=true) 
    */ 
    protected $model; 

    /** 
    * @ORM\OneToMany(targetEntity="Part", mappedBy="part_device") 
    */ 
    protected $parts = null; 

... 

    public function __construct(){ 
     // This is an array of parts. 
     $this->parts = new ArrayCollection(); 

     // Create the other arrays too. 
     $this->repairs = new ArrayCollection(); 
     $this->customers = new ArrayCollection(); 
    } 

    /* 
    * This should automatically be generated by the command. 
    * php bin/console doctrine:generate:entities AppBundle/Entity/Device 
    */ 
    public function addPart($part){ 
     $this->parts[] = $part; 
    } 
} 

Hoffentlich Sie den Rest herausfinden können.Aber ich denke, das ist ein guter Anfang.

+0

Darn, du hast gerade dein Diagramm bearbeitet. Das sieht besser aus als das andere. –

+0

Hey Alvin, danke für die ausführliche Antwort. Das Problem ist jedoch nicht, dass ich keine Beziehungen zwischen Entitäten herstellen kann. Es ist mehr, dass ich ein Gerät brauche, das sowohl durch seinen Namen als auch seine Farbe identifiziert werden kann (was an sich eine Viele-zu-Viele ist, da ein Gerät eine Anzahl von Farben haben kann), um mit den richtigen Reparaturen übereinzustimmen. Ich denke, dass ich jetzt etwas mit zusammengesetzten Schlüsseln machen kann ... aber immer noch unsicher, wie es gemacht wird. – bluppfisk

+0

Frage: Haben die Telefone mit unterschiedlichen Farben "eindeutige" Modellnummern? Ich frage mich nur, wie identifiziert der Hersteller sie mit verschiedenen Farben? Früher habe ich in einer Produktionsfirma gearbeitet, und es gab verschiedene Modellnummern, um das zu identifizieren. Deshalb stelle ich die Frage. –