Inventardatenbankstruktur, wenn Inventargegenstände unterschiedliche Attribute haben

10

Ich erstelle eine Inventardatenbank zum Speichern von Hardware-Informationen für Unternehmen. Die Geräte, über die die Datenbank verfügt, verfolgen die Reichweite von Workstations, Laptops, Switches, Routern, Mobiltelefonen usw. Ich verwende die Seriennummern der Geräte als Primärschlüssel. Das Problem, das ich habe, ist, dass die anderen Attribute für diese Geräte variieren und ich keine Felder in der Inventartabelle haben möchte, die nicht mit anderen Geräten zusammenhängen. Unten finden Sie einen Link zu einer ERD eines Teils der Datenbank (einige FK-Beziehungen werden nicht angezeigt). Ich versuche zum Beispiel, es so einzurichten, dass ein Gerät mit einem Workstation-Gerätetyp nicht in die Telefontabelle aufgenommen werden kann. Dies scheint die Verwendung vieler Trigger zur Überprüfung des Gerätetyps oder der Geräteklasse zu erfordern, und neue Tabellen werden immer dann verfolgt, wenn ein anderes Gerät mit unterschiedlichen Attributen verfolgt wird.

ERD1

Ich habe versucht, Attributtabellen einzurichten, die Seriennummern zugeordnet werden können, aber damit Attribute, die nicht für einen Gerätetyp gelten, einem Gerät zugewiesen werden können, z. B. könnte jemand einer Workstation ein Telefonnummernattribut zuweisen, wenn er dies wünscht . Ich habe auf dieser Seite eine Erklärung gefunden, die folgende Struktur aufweist:

Widget-Beispiel ERD

Diese Struktur würde hervorragend funktionieren, wenn die Attribute alle auf die von mir gespeicherten Elemente anwendbar wären. Wenn in der Datenbank beispielsweise nur Mobiltelefone gespeichert sind, können die Attribute beispielsweise Touchscreen, Trackpad, Tastatur, 4G, 3G usw. sein. In diesem Fall gelten sie alle für Telefone. Meine Datenbank verfügt über Attribute wie Hostname, CircuitType und Telefonnummer, die nur für bestimmte Gerätetypen gelten.

Ich möchte es so einrichten, dass einem Gerät dieses Typs nur die Attribute zugewiesen werden können, die für einen bestimmten Gerätetyp gelten. Irgendwelche Vorschläge zum Einrichten dieser Datenbank? Ich bin mir nicht sicher, ob dies eine ordnungsgemäße Verwendung von Eins-zu-Eins-Beziehungen ist oder ob es einen besseren Weg gibt, dies zu tun. Vielen Dank im Voraus, dass Sie sich die Zeit genommen haben, dies zu untersuchen.

Hier sind einige der anderen Themen, die ich gelesen habe. Sie gaben mir einige gute Einblicke, aber ich glaube nicht, dass sie wirklich zutreffen:

/programming/9335548/how-to-structure-database-for-inventory-of-unlike-items

/programming/1249632/database-structure-for-items-with-varying-attributes

/programming/5559587/product-inventory-with-multiple-attributes

/programming/6613802/question-about-setting-up-inventory-database

/programming/514111/how-to-best-represent-items-with-variable-of-attributes-in-a-database

TheSecretSquad
quelle

Antworten:

6

Supertyp / Subtyp

Wie wäre es mit einem Blick auf das Supertyp / Subtyp-Muster? Allgemeine Spalten werden in einer übergeordneten Tabelle gespeichert. Jeder einzelne Typ hat eine eigene Tabelle mit der ID des übergeordneten Typs als eigene PK und enthält eindeutige Spalten, die nicht allen Untertypen gemeinsam sind. Sie können eine Typspalte sowohl in übergeordnete als auch in untergeordnete Tabellen aufnehmen, um sicherzustellen, dass jedes Gerät nicht mehr als einen Untertyp haben kann. Erstellen Sie eine FK zwischen den untergeordneten und den übergeordneten Elementen (ItemID, ItemTypeID). Sie können FKs entweder für die Supertyp- oder Subtyp-Tabellen verwenden, um die gewünschte Integrität an anderer Stelle aufrechtzuerhalten. Wenn beispielsweise die ItemID eines beliebigen Typs zulässig ist, erstellen Sie die FK für die übergeordnete Tabelle. Wenn nur auf SubItemType1 verwiesen werden kann, erstellen Sie die FK für diese Tabelle. Ich würde die TypeID aus referenzierenden Tabellen herauslassen.

Benennung

Wenn es um die Benennung geht, haben Sie meines Erachtens zwei Möglichkeiten (da die dritte Wahl von nur "ID" in meinen Augen ein starkes Anti-Muster ist). Rufen Sie entweder den Subtypschlüssel ItemID wie in der übergeordneten Tabelle auf, oder nennen Sie ihn den Subtypnamen wie DoohickeyID. Nach einigem Nachdenken und einigen Erfahrungen damit empfehle ich, es DoohickeyID zu nennen. Der Grund dafür ist, dass, obwohl es Verwirrung über die Subtyp-Tabelle geben könnte, die wirklich verkleidete Elemente enthält (und nicht Doohickeys), dies ein kleines Minus ist, verglichen mit dem Erstellen einer FK für die Doohickey-Tabelle und den Spaltennamen nicht Spiel!

An EAV oder nicht an EAV - Meine Erfahrung mit einer EAV-Datenbank

Wenn EAV das ist, was Sie wirklich tun müssen, dann ist es das, was Sie tun müssen. Aber was wäre, wenn Sie es nicht tun müssten?

Ich habe eine EAV-Datenbank erstellt, die in einem Unternehmen verwendet wird. Gott sei Dank ist der Datensatz klein (obwohl es Dutzende von Elementtypen gibt), sodass die Leistung nicht schlecht ist. Aber es wäre schlecht, wenn die Datenbank mehr als ein paar tausend Elemente enthalten würde! Darüber hinaus sind die Tabellen so schwer abzufragen. Diese Erfahrung hat mich zu dem Wunsch geführt, EAV-Datenbanken in Zukunft möglichst zu meiden.

Jetzt habe ich in meiner Datenbank eine gespeicherte Prozedur erstellt, die automatisch PIVOTed-Ansichten für jeden vorhandenen Subtyp erstellt. Ich kann nur von AutoDoohickey abfragen. Meine Metadaten zu den Untertypen enthalten eine Spalte "ShortName", die einen objektsicheren Namen enthält, der für die Verwendung in Ansichtsnamen geeignet ist. Ich habe sogar die Ansichten aktualisierbar gemacht! Leider können Sie sie bei einem Join nicht aktualisieren, aber Sie können eine bereits vorhandene Zeile in sie einfügen, die in ein UPDATE konvertiert wird. Leider können Sie nicht nur einige Spalten aktualisieren, da Sie in VIEW nicht angeben können, welche Spalten Sie mit dem Konvertierungsprozess INSERT-to-UPDATE aktualisieren möchten: Ein NULL-Wert sieht aus wie "Diese Spalte auf NULL aktualisieren", auch wenn Sie wollten angeben, dass diese Spalte überhaupt nicht aktualisiert werden soll.

Trotz all dieser Dekoration, um die Verwendung der EAV-Datenbank zu vereinfachen, verwende ich diese Ansichten bei den meisten normalen Abfragen immer noch nicht, da sie LANGSAM sind. Abfragebedingungen sind keine Prädikate, die vollständig in die ValueTabelle zurückgeschoben werden. Daher muss vor dem Filtern eine Zwischenergebnismenge aller Elemente des Typs dieser Ansicht erstellt werden. Autsch. Ich habe also viele, viele Abfragen mit vielen, vielen Verknüpfungen, von denen jede einen anderen Wert erhält und so weiter. Sie arbeiten relativ gut, aber autsch! Hier ist ein Beispiel. Der SP, der dies (und seinen Update-Trigger) erstellt, ist ein riesiges Tier, und ich bin stolz darauf, aber es ist nichts, was Sie jemals versuchen möchten, aufrechtzuerhalten.

CREATE VIEW [dbo].[AutoModule]
AS
--This view is automatically generated by the stored procedure AutoViewCreate
SELECT
   ElementID,
   ElementTypeID,
   Convert(nvarchar(160), [3]) [FullName],
   Convert(nvarchar(1024), [435]) [Descr],
   Convert(nvarchar(255), [439]) [Comment],
   Convert(bit, [438]) [MissionCritical],
   Convert(int, [464]) [SupportGroup],
   Convert(int, [461]) [SupportHours],
   Convert(nvarchar(40), [4]) [Ver],
   Convert(bit, [28744]) [UsesJava],
   Convert(nvarchar(256), [28745]) [JavaVersions],
   Convert(bit, [28746]) [UsesIE],
   Convert(nvarchar(256), [28747]) [IEVersions],
   Convert(bit, [28748]) [UsesAcrobat],
   Convert(nvarchar(256), [28749]) [AcrobatVersions],
   Convert(bit, [28794]) [UsesDotNet],
   Convert(nvarchar(256), [28795]) [DotNetVersions],
   Convert(bit, [512]) [WebApplication],
   Convert(nvarchar(10), [433]) [IFAbbrev],
   Convert(int, [437]) [DataID],
   Convert(nvarchar(1000), [463]) [Notes],
   Convert(nvarchar(512), [523]) [DataDescription],
   Convert(nvarchar(256), [27991]) [SpecialNote],
   Convert(bit, [28932]) [Inactive],
   Convert(int, [29992]) [PatchTestedBy]
FROM (
   SELECT
      E.ElementID + 0 ElementID,
      E.ElementTypeID,
      V.AttrID,
      V.Value
   FROM
      dbo.Element E
      LEFT JOIN dbo.Value V ON E.ElementID = V.ElementID
   WHERE
      EXISTS (
         SELECT *
         FROM dbo.LayoutUsage L
         WHERE
            E.ElementTypeID = L.ElementTypeID
            AND L.AttrLayoutID = 7
      )
) X
PIVOT (
   Max(Value)
   FOR AttrID IN ([3], [435], [439], [438], [464], [461], [4], [28744], [28745], [28746], [28747], [28748], [28749], [28794], [28795], [512], [433], [437], [463], [523], [27991], [28932], [29992])
) P;

Hier ist eine andere Art von automatisch generierter Ansicht, die von einer anderen gespeicherten Prozedur aus speziellen Metadaten erstellt wird, um Beziehungen zwischen Elementen zu finden, zwischen denen mehrere Pfade liegen können (insbesondere: Modul-> Server, Modul-> Cluster-> Server, Modul-> DBMS- > Server, Modul-> DBMS-> Cluster-> Server):

CREATE VIEW [dbo].[Link_Module_Server]
AS
-- This view is automatically generated by the stored procedure LinkViewCreate
SELECT
   ModuleID = A.ElementID,
   ServerID = B.ElementID
FROM
   Element A
   INNER JOIN Element B
      ON EXISTS (
         SELECT *
         FROM
            dbo.Element R1
         WHERE
            A.ElementID = R1.ElementID1
            AND B.ElementID = R1.ElementID2
            AND R1.ElementTypeID = 38
      ) OR EXISTS (
         SELECT *
         FROM
            dbo.Element R1
            INNER JOIN dbo.Element R2 ON R1.ElementID2 = R2.ElementID1
         WHERE
            A.ElementID = R1.ElementID1
            AND R1.ElementTypeID = 40
            AND B.ElementID = R2.ElementID2
            AND R2.ElementTypeID = 38
      ) OR EXISTS (
         SELECT *
         FROM
            dbo.Element R1
            INNER JOIN dbo.Element R2 ON R1.ElementID2 = R2.ElementID1
         WHERE
            A.ElementID = R1.ElementID1
            AND R1.ElementTypeID = 38
            AND B.ElementID = R2.ElementID2
            AND R2.ElementTypeID = 3122
      ) OR EXISTS (
         SELECT *
         FROM
            dbo.Element R1
            INNER JOIN dbo.Element R2 ON R1.ElementID2 = R2.ElementID1
            INNER JOIN dbo.Element C2 ON R2.ElementID2 = C2.ElementID
            INNER JOIN dbo.Element R3 ON R2.ElementID2 = R3.ElementID1
         WHERE
            A.ElementID = R1.ElementID1
            AND R1.ElementTypeID = 40
            AND C2.ElementTypeID = 3080
            AND R2.ElementTypeID = 38
            AND B.ElementID = R3.ElementID2
            AND R3.ElementTypeID = 3122
      )
WHERE
   A.ElementTypeID = 9
   AND B.ElementTypeID = 17

Der hybride Ansatz

Wenn Sie einige der dynamischen Aspekte einer EAV-Datenbank haben MÜSSEN, können Sie die Metadaten so erstellen, als hätten Sie eine solche Datenbank, aber stattdessen das Entwurfsmuster für Supertyp / Subtyp verwenden. Ja, Sie müssten neue Tabellen erstellen und Spalten hinzufügen, entfernen und ändern. Aber mit der richtigen Vorverarbeitung (wie ich es mit den Auto-Ansichten meiner EAV-Datenbank getan habe) könnten Sie echte tabellenähnliche Objekte haben, mit denen Sie arbeiten können. Nur wären sie nicht so knorrig wie meine und das Abfrageoptimierungsprogramm könnte Push-down auf Basistabellen prädizieren (lesen Sie: gute Leistung mit ihnen). Es würde nur eine Verknüpfung zwischen der Supertyp-Tabelle und der Subtyp-Tabelle geben. Ihre Anwendung kann so eingestellt sein, dass sie die Metadaten liest, um herauszufinden, was sie tun soll (oder in einigen Fällen kann sie die automatisch generierten Ansichten verwenden).

Oder wenn Sie einen mehrstufigen Satz von Untertypen hatten, nur ein paar Verknüpfungen. Mit mehrstufig meine ich, wenn einige Untertypen gemeinsame Spalten haben, aber nicht alle, könnten Sie eine Untertypentabelle für diejenigen haben, die selbst ein Supertyp einiger anderer Tabellen ist. Wenn Sie beispielsweise Informationen zu Servern, Routern und Druckern speichern, kann ein Zwischenuntertyp von "IP-Gerät" sinnvoll sein.

Ich werde den Vorbehalt geben, dass ich noch keine solche hybride Datenbank mit Supertyp / Subtyp-EAV-Metatable-Dekor erstellt habe, wie ich sie hier vorschlage, um sie noch in der realen Welt auszuprobieren. Aber die Probleme, die ich mit EAV hatte, sind nicht klein, und etwas zu tun ist wahrscheinlich ein absolutes Muss, wenn Ihre Datenbank groß sein soll und Sie eine gute Leistung ohne verrückte teure gigantische Hardware wünschen.

Meiner Meinung nach wäre die Zeit, die für die Automatisierung der Verwendung / Erstellung / Änderung realer Subtyp-Tabellen aufgewendet wird, letztendlich die beste. Wenn ich mich auf die Flexibilität der Daten konzentriere, klingt der EAV so attraktiv (und glauben Sie mir, ich liebe es, wenn jemand mich nach einem neuen Attribut für einen Elementtyp fragt, kann ich es in etwa 18 Sekunden hinzufügen und sofort mit der Eingabe von Daten auf der Website beginnen ). Flexibilität kann jedoch auf mehrere Arten erreicht werden! Die Vorverarbeitung ist ein weiterer Weg, dies zu tun. Es ist eine so leistungsstarke Methode, die so wenige Menschen verwenden. Sie bietet die Vorteile einer vollständigen Datensteuerung, aber die Leistung einer harten Codierung.

(Hinweis: Ja, diese Ansichten sind wirklich so formatiert und die PIVOT-Ansichten haben wirklich Update-Trigger. :) Wenn jemand wirklich so an den schrecklichen schmerzhaften Details des langen und komplizierten UPDATE-Triggers interessiert ist, lass es mich wissen und ich werde es posten ein Beispiel für Sie.)

Und noch eine Idee

Schreiben Sie alle Ihre Daten in eine Tabelle. Geben Sie Spalten generische Namen und verwenden / missbrauchen Sie sie dann für mehrere Zwecke. Erstellen Sie Ansichten über diese, um ihnen sinnvolle Namen zu geben. Fügen Sie Spalten hinzu, wenn eine nicht verwendete Spalte vom geeigneten Datentyp nicht verfügbar ist, und aktualisieren Sie Ihre Ansichten. Trotz meiner Länge über Subtyp / Supertyp kann dies der beste Weg sein.

ErikE
quelle
Ich dachte an dieses Design, bei dem jede Subtyp-Tabelle die PK aus den übergeordneten und den ungewöhnlichen Feldern hatte. Ich dachte, ich könnte das Typfeld in die übergeordnete und jede Subtyp-Tabelle einfügen und sie dann mit einer CHECK-Einschränkung versehen. Ich habe mich entschieden, dieses Design zu vermeiden, da es immer dann eine neue Tabelle erfordern würde, wenn ein neuer Gerätetyp verfolgt werden muss, und viele Eins-zu-Eins-Beziehungen. Es schien chaotisch und unflexibel. Ich freue mich jedoch über Ihre Beiträge.
TheSecretSquad
Ich habe eine EAV-Datenbank erstellt, die in einem Unternehmen verwendet wird. Gott sei Dank ist der Datensatz klein (obwohl es Dutzende von Elementtypen gibt), sodass die Leistung nicht schlecht ist. Aber es wäre, wenn die Datenbank mehr als ein paar tausend Elemente enthalten würde. Diese Erfahrung hat mich zu dem Wunsch geführt, EAV-Datenbanken in Zukunft möglichst zu vermeiden, da sie so schwer abzufragen sind.
ErikE
Außerdem wäre meiner Meinung nach die Zeit, die für die Automatisierung der Verwendung / Erstellung / Änderung realer Subtyp-Tabellen aufgewendet wird, letztendlich am besten.
ErikE
Nachdem ich das EAV-Muster untersucht hatte, stellte ich fest, dass die Werte für die Attribute gezwungen sind, einen Datentyp gemeinsam zu nutzen (in diesem Fall alle Zeichenfolgen). Das Abfragen des EAV-Setups ist ebenfalls mühsam. Supertyp / Subtyp sieht besser aus. Meine Frage ist jetzt, ob bestimmte Tabellen nur bestimmte Gerätetypen zulassen. Überprüfe ich dies, indem ich in jede Tabelle eine Geräteklassen-ID (Telefon, Computer, Router) einfüge und dieses Feld prüfe, oder schließe ich dieses Feld aus den Subtyp-Tabellen aus und verwende für jede Tabelle einen Trigger? Bitte beachten Sie ERD3 als Referenz.
TheSecretSquad
1
Zum Abfragen von EAV-Daten ist es nicht ungewöhnlich, ein Datamart relationaler Tabellen für die Daten zu erstellen, die Sie abfragen möchten, und diese dann mit einem Skript zu füllen. Die Abfragen werden schneller ausgeführt, jedoch nur für die Daten, die Sie in den Datamart eingegeben haben, und das Setup erfordert einiges an Planung.
FrustratedWithFormsDesigner
6

In Ihrem Fall ist der beste Ansatz eine Variation des EAV-Modells (Entity-Attribute-Value). Es gibt viele Leute, die sich vor EAV scheuen, weil es in gewisser Weise nicht hilfreich ist und oft missbraucht wird. EAV ist jedoch eine Lösung, die für Ihre spezifischen Anforderungen gut geeignet ist.

Die Variation, die Sie für Ihre Situation einbeziehen möchten, besteht darin, die Attribute eine Ebene von Ihren Entitäten entfernt (dh Ihren Inventargegenständen) zu abstrahieren. Im Wesentlichen möchten Sie Gerätetypen definieren , die eine Liste von Attributen enthalten. Anschließend definieren Sie Geräteinstanzen , die Werte für jedes der Attribute haben, die Geräte dieses Typs haben sollen.

Hier ist eine ERD-Skizze:

ERD

DEVICE_ATTRIBUTEenthält die Werte für jeden Typ eines generischen Attributs. DEVICE_TYPEDefiniert die Liste der generischen Attribute, die für einen bestimmten Gerätetyp gelten (dies sind die TYPICAL_DEVICE_ATTRIBUTEs.

Auf diese Weise können Sie steuern, welche Attribute für ein Gerät ausgefüllt werden müssen, während Geräte unterschiedlichen Typs unterschiedliche Attributlisten haben. Es erleichtert Ihnen auch den Vergleich zwischen Geräten, indem Sie deren Attribute gegeneinander ausrichten.

Joel Brown
quelle
Dies ähnelt dem, was ssmusoke empfohlen hat. Ich habe meine ERD anhand seiner Empfehlung geändert und es sieht so aus, als würde sie zu Ihrer passen. Schauen Sie sich das neue RD unter http://www.dividegraphics.com/ERD2.jpg an und geben Sie Feedback.
TheSecretSquad
@reallythecrash - Sie haben Recht, ich schlage den gleichen grundlegenden Ansatz wie ssmusoke vor. Ich habe meine Antwort nur anders angegangen, um das Verständnis sowohl der Struktur des Modells als auch der Gründe für die Verwendung von EAV zu erleichtern Viele Menschen denunzieren (zu Unrecht) als Anti-Muster.
Joel Brown
Nach einigen Recherchen sehe ich, warum Leute EAV als Anti-Muster betrachten könnten. Ich denke, es ist einfach, Daten mit EAV zu speichern, aber besonders komplex für die Abfrage und Pflege von Datentypen. Ich denke, es ist ein Muster mit einem engen Zweck und sollte von erfahrenen Entwicklern verwendet werden, die es richtig implementieren können, dh nicht von mir. Ich werde mich wahrscheinlich für das Supertyp / Subtyp-Paradigma entscheiden.
TheSecretSquad
@JoelBrown - Mit welcher Software haben Sie dieses Diagramm entworfen? Sieht cool aus.
Vidar
@Vidar - Ich habe Visio mit ERD-Smartshapes verwendet, die ich unter Verwendung der visuellen Konventionen von James Martin erstellt und mit einem benutzerdefinierten Linienmuster gezeichnet habe, das skizzenhaft ist. Ich finde, dass dies ein gutes Werkzeug für Schnell- / Entwurfsdatenmodelle ist. Wenn das Diagramm zu formal ist, kann dies dazu führen, dass einige Leute glauben, es sei fertig. Etwas Skizziertes hilft also zu verhindern, dass Leute zu Schlussfolgerungen darüber gelangen, wie fest / fertig ein Datenmodell ist.
Joel Brown
1
  1. Der Gesamtansatz lautet wie folgt:

a) Ein Entity-Attribute-Value-Modellansatz, um die Attribute der verschiedenen Geräte einem Gerätetyp zuzuordnen. Jeder Gerätetyp verfügt über eine Liste von Attributen, deren Werte Sie verfolgen

b) Für jeden Gerätetyp verfolgen Sie die Inventardetails anhand der Seriennummer, die einem einzelnen Gerät entspricht.

  1. Sie würden also die folgenden Tabellen erhalten:

a) Attribute - Definieren Sie die Attribute für alle Gerätespalten (alles in dieser Tabelle): ID, Name, Beschreibung

b) Elementattribute - Definiert die zulässigen Attribute für ein bestimmtes Gerät - Element-ID, Attribut-ID

c) Artikeldefinition - Definiert einen Artikel wie Black Berry Torch 4500, Iphone 4S, Iphone 3S usw. - ID, Name, Beschreibung, Kategorie-ID (wenn Sie Kategorien wie Mobiltelefone, Schalter usw. hinzufügen möchten).

d) Geräte - die einzelnen Geräte - ID, Artikel-ID, Inventardatum, Deaktiviert, Seriennummer ... (im Grunde alle anderen Attribute für ein Gerät)

Wenn Sie weitere Informationen zu Gerätetransaktionen verfolgen möchten, können Sie nach Bedarf weitere mit dem Gerät verknüpfte Tabellen hinzufügen.

Stephen Senkomago Musoke
quelle
Danke für deinen Beitrag. Dies stimmt mit dem überein, wonach ich suche. Ich konnte einfach nicht herausfinden, wie es geht. Ich habe meine ERD geändert, um Ihre Spezifikationen widerzuspiegeln. Es scheint mehr Arbeit zu erfordern, um alle zulässigen Attribute für jeden Gerätetyp einzugeben, aber es sieht auch so aus, als ob es maximale Flexibilität bietet. Ich werde einen kleinen Prototyp machen, um zu sehen, ob er so funktioniert, wie ich es mir vorstelle. Danke noch einmal. Ich habe eine ERD mit den Änderungen hochgeladen, wenn Sie einen Blick darauf werfen und mich wissen lassen möchten, ob ich auf dem richtigen Weg bin. http://www.dividegraphics.com/ERD2.jpg
TheSecretSquad
Ja, Sie sind auf dem richtigen Weg.
Stephen Senkomago Musoke
EAV bietet viel Flexibilität, aber Sie haben auch viel mehr Metadaten, damit es funktioniert.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner scheint unvermeidlich, wenn das System eine große Auswahl an Gegenständen, Telefonen, Schaltern, PCs, Laptops usw. speichert. Besser mehr Metadaten als mehr Tabellen, würde ich sagen
Stephen Senkomago Musoke
1
@ssmusoke: Einverstanden, aber ich wollte diesen Punkt hervorheben, weil ich gesehen habe, dass die Leute die Bedeutung von Metadaten nicht erkennen und ihre EAV-Implementierung dann zu einem Albtraum wird.
FrustratedWithFormsDesigner