Lehre ORM auf EAV-Tabellen

8

Ich hatte geplant, meine Anwendung zu erstellen und ein ORM für die Modelle zu verwenden, aber die Sache ist, dass es einen Teil der Datenbank gibt, der Entity-Attribute-Value-Tabellen verwendet.

Ich mochte Doctrine ORM sehr, aber ich weiß nicht, ob es möglich ist, vielleicht Klassen zu erstellen, die wie jede gewöhnliche Doktrin-Entität aussehen würden, wenn die tatsächlich verknüpfte Tabelle vom EAV-Stil ist.

Wäre es möglich, Doctrine dafür zu verwenden, und wenn ja, wie?

    
Jronny 02.01.2013, 14:40
quelle

2 Antworten

4

definitiv möglich:

Beziehungen wie folgt haben: Objekt (eins zu viele) - & gt; Attributwert - & gt; Viele zu Eins - & gt; AttributType

    
Mike Graf 14.01.2013, 23:19
quelle
0

Im Hinblick auf EAV es Es scheint offensichtlich zu sein, wie man eine Beziehung zwischen entity und attribute mit Hilfe der Doktrin aufbauen kann. Im kompliziertesten Fall handelt es sich um ein Viele zu viele Beziehung.

Nehmen wir an, wir möchten ein Attribut Name einer Entität User zuordnen. Unter der Annahme, dass ein Benutzer genau einen Namen hat und jeder Name genau einem Benutzer gehört, kann dieser Link mit Eins zu eins Beziehung

Aber wie modelliere ich die Beziehung zwischen attribute und value ? Das Problem ist, dass Werte unterschiedliche Typen sein können oder sogar eine unterschiedliche Anzahl von Feldern benötigen, um ihre Informationen zu speichern.

Betrachten Sie die Attribute name und phone_number . Während ein Name möglicherweise durch eine Zeichenfolge dargestellt wird, könnte für die Telefonnummer eine Ganzzahl erforderlich sein. Oder es ist sogar notwendig, nicht nur die Nummer, sondern auch die Vorwahl in einem separaten Feld zu hinterlegen.

Da EAV eine sehr flexible Wertdarstellung erfordert, ist es nicht möglich, alle von ihnen innerhalb desselben Feldes in einer Datenbanktabelle zu speichern (Blobs, Datenserialisierung und dergleichen ignorieren). Daher verwenden die meisten EAV-Implementierungen verschiedene Tabellen, die verschiedene Werttypen repräsentieren.

Um eine solche Flexibilität zu erreichen, bietet die Doktrin Vererbung Mapping Es erlaubt Ihnen im Grunde, Doktrinsentitäten zu erweitern. Sie geben dabei discriminator für jeden Untertyp Ihrer Entität an:

%Vor%

Die Klasse Value bietet eine gemeinsame Implementierung für alle Werte, d. h. eine ID. Jede Unterklasse (d. H.% Co_de% und Name ) erweitert diese gemeinsamen Werte um ihre spezifischen, z. B. zusätzliche Felder.

  • Das PhoneNumber definiert eine Spalte in der Elternrelation, die den Typ des Wertes speichert.
  • Das @DiscriminatorColumn wird von der Doktrin verwendet, um den Typ von @DiscriminatorMap einer dieser Klassen zuzuordnen.

Die Beziehung zwischen @DiscriminatorColumn und attribute kann für die Elternklasse angegeben werden. Das Aufrufen von Werten aus dem Attribut ruft dann alle Arten von Werten ab, die während der Laufzeit gefiltert und behandelt werden können, beispielsweise unter Verwendung von instanceof .

    
magic_al 21.10.2015 21:46
quelle