it-swarm.com.de

Warum speichert Drupal jedes benutzerdefinierte Feld in einer separaten Tabelle?

Ich verstehe, dass zusätzliche Felder in der Datenbank erstellt werden müssen, um Knoten und Knotentypen Funktionen hinzuzufügen.

Jetzt verstehe ich nicht, warum ein Ein-Feld-Eine-Tabelle-Schema verwendet wird, anstatt das Schema einer einzelnen Tabelle für einen Inhaltstyp und dann in dieser zusätzlichen Tabelle alle zusätzlichen Felder zu bevorzugen. Was sind die Abenteuer dieses Ansatzes?

Ich habe eine Site mit mehr als 1.000 Tabellen und es ist ein Chaos, sie zu verwalten.

5
Cesar

Weil Sie die Felder beispielsweise wiederverwenden und an mehr als einen Inhaltstyp anhängen können.

Sie erhalten tatsächlich 2 Tabellen für jedes Feld: eine zum Speichern der aktuellen Version der Daten (field_data_field_MACHINE_NAME) und der andere zum Speichern der "historischen" Werte (wenn Revisionen aktiviert sind) (field_revision_field_MACHINE_NAME). Einige Inhaltstypen können die Revision aktiviert haben, was bedeutet, dass freigegebene Felder "flexibel" genug sein müssen, um dies zu verfolgen, aber gleichzeitig die Werte für Inhaltstypen mit deaktivierter Revision speichern.

Wenn Sie alles in einer großen Tabelle für Inhaltstypen hätten (ich denke, D5 hat dies getan), wäre die Verwaltung sehr schwierig, insbesondere wenn Sie Felder zwischen Entitäten (z. B. Knoten und Benutzern) gemeinsam nutzen würden.

Einige Vorschläge:

  • Weitere Informationen finden Sie unter this Antwort von Clive.

  • Überprüfen Sie dies bei einer Neuinstallation, um festzustellen, wie es funktioniert. Erstellen Sie zwei Inhaltstypen, fügen Sie einige Felder hinzu (teilen Sie einige davon) und verfolgen Sie, was geändert wurde und wie die Daten in der Datenbank gespeichert werden. Sie könnten wahrscheinlich eine Dokumentationsseite ausgraben, aber ich denke, dies ist der beste Weg, um das Schema zu verstehen.

  • Verwenden Sie die Felder nach Möglichkeit erneut, um die Datenbank weiter zu optimieren. Beachten Sie, dass es möglicherweise einige Einschränkungen gibt (z. B. Listenoptionen, Datei-Uploads, erforderlich oder nicht usw.), mit denen Sie Felder nicht für jede Instanz anpassen können, sodass Sie neue Felder erstellen müssen.

Ich habe das ziemlich schnell geschrieben, aber ich hoffe, ich habe es geschafft, es zu erklären.

12
Aram Boyajyan

Tolle Antwort von Aram! Dies beinhaltet eine Erklärung, wie "benutzerdefinierte Felder" technisch in einer Drupal - Datenbank implementiert sind.

Wenn Sie sich fragen, woher das "Schema" (wie in der Frage) stammt, schlage ich eine höhere Abstraktionsebene vor, die ich (noch) das "Datenmodell" nenne, dessen Drupal -Datenbank) ist eine technische Implementierung. Und das führt automatisch zu " Database Normalization ", einem Konzept, das von E. Codd eingeführt wurde. Die wichtigsten Konzepte, an die ich mich seit meinem Abschluss erinnere, sind diese ::

Ich erinnere mich, dass es noch mehr gab (wie 4NF usw.).

Die "Regel", mit der wir immer die Qualität unseres Datenmodells gemessen haben, war folgende:

" Alles hängt vom Schlüssel ab, nichts als der Schlüssel, also hilf mir ... Codd" ...

Über die eigentliche "Erstellung" solcher Schemata (Diagramme), z. B. zur Modellierung von Viele-zu-Viele-Beziehungen: In den 90er Jahren (zur Zeit von Windows 3.1 und OS/2) gab es den "AD-Zyklus" von IBM. Ein Teil des "Hype" war dann die Verwendung von "CASE Tools".

Einer von ihnen war " Bachman ", ein "Expertensystem", das von Mr. "Charles W. ( Charlie) Bachman ", der maßgeblich an der Erstellung von IDMS beteiligt war (ein DBMS, das in Mainframes verwendet wird ... noch heute!). Hierher stammen auch die " Bachman-Diagramme" (die heute noch verwendet werden ...).

Wir haben das Bachman-Tool verwendet, um:

  1. überprüfen Sie unser Datenmodell automatisch (die Wartemeldungen lauteten so etwas wie " Warten Sie, während der Berater der Fliege Ihr Design überprüft" ...) und
  2. weiterleiten eines solchen Datenmodells automatisch an DBMS-Implementierungen für IDMS oder DB2 und
  3. reverse Engineering einer vorhandenen Datenbankimplementierung (z. B. hierarchisches IMS) zu einem Datenmodell.

Es würde Spaß machen (interessant), heute ein ähnliches Reverse Engineering mit dem Datenbankschema Drupal) durchzuführen, um zu sehen, wie "Bachman" sein entsprechendes Datenmodell auswerten würde ... und mögliche Verstöße gegen 1NF zu entdecken. 2NF oder 3NF ... (falls vorhanden).

Hinweis : Weitere interessante Hintergrundinformationen finden Sie in Fügen Sie dem Kern Fremdschlüssel hinz , wie in @ mpdonadio) vorgeschlagen 's Kommentar unten.

PS: Ich wette, Dries muss während seines Abschlusses auch von Codd ... oder " Charlie" gehört haben.

1
Pierre.Vriens