Wir entwickeln eine kommerzielle Anwendung. Unsere Kunden bitten um Unterstützung für benutzerdefinierte Felder. Beispielsweise möchten sie dem Kundenformular ein Feld hinzufügen.
Was sind die bekannten Entwurfsmuster zum Speichern der Feldwerte und der Metadaten zu den Feldern?
Ich sehe diese Optionen jetzt:
Option 1 : Fügen Sie meiner Kundentabelle Spalten vom Typ varchar vom Typ varchar Feld1, Feld2, Feld3, Feld4 hinzu.
Option 2 : Fügen Sie der Kundentabelle eine einzelne Spalte vom Typ XML hinzu und speichern Sie die Werte der benutzerdefinierten Felder in XML.
Option 3 : Fügen Sie eine CustomerCustomFieldValue-Tabelle mit einer Spalte vom Typ varchar hinzu und speichern Sie die Werte in dieser Spalte. Diese Tabelle hätte auch eine CustomerID, eine CustomFieldID.
CustomerID, CustomFieldID, Value
10001, 1001, '02/12/2009 8:00 AM'
10001, 1002, '18.26'
10002, 1001, '01/12/2009 8:00 AM'
10002, 1002, '50.26'
CustomFieldID wäre eine ID aus einer anderen Tabelle namens CustomField mit den folgenden Spalten: CustomFieldID, FieldName, FieldValueTypeID.
Option 4 : Fügen Sie eine CustomerCustomFieldValue-Tabelle mit einer Spalte jedes möglichen Werttyps hinzu und speichern Sie die Werte in der rechten Spalte. Ähnlich wie # 3, jedoch werden Feldwerte unter Verwendung einer stark typisierten Spalte gespeichert.
CustomerID, CustomFieldID, DateValue, StringValue, NumericValue
10001, 1001, 02/12/2009 8:00 AM, null, null
10001, 1002, null, null, 18.26
10002, 1001, 01/12/2009 8:00 AM, null, null
10002, 1002, null, null, 50.26
Option 5 : Die Optionen 3 und 4 verwenden eine Tabelle, die für ein einzelnes Konzept (Kunde) spezifisch ist. Unsere Kunden fragen nach benutzerdefinierten Feldern auch in anderen Formen. Sollten wir stattdessen ein systemweites benutzerdefiniertes Feldspeichersystem haben? Anstatt also mehrere Tabellen wie CustomerCustomFieldValue, EmployeeCustomFieldValue, InvoiceCustomFieldValue zu haben, hätten wir eine einzige Tabelle mit dem Namen CustomFieldValue? Obwohl es mir eleganter erscheint, würde das nicht zu einem Leistungsengpass führen?
Haben Sie einen dieser Ansätze verwendet? Warst du erfolgreich? Welchen Ansatz würden Sie wählen? Kennen Sie einen anderen Ansatz, den ich in Betracht ziehen sollte?
Außerdem möchten meine Kunden, dass das benutzerdefinierte Feld auf Daten in anderen Tabellen verweisen kann. Beispielsweise möchte ein Kunde dem Kunden möglicherweise ein Feld "Bevorzugte Zahlungsmethode" hinzufügen. Zahlungsmethoden werden an anderer Stelle im System definiert. Das bringt das Thema "Fremdschlüssel" ins Bild. Sollte ich versuchen, Einschränkungen zu erstellen, um sicherzustellen, dass die in den benutzerdefinierten Feldtabellen gespeicherten Werte gültige Werte sind?
Vielen Dank
======================
EDIT 27.07.2009:
Danke für deine Antworten. Es scheint, dass die Liste der Ansätze jetzt ziemlich umfassend ist. Ich habe die Option 2 (eine einzelne XML-Spalte) ausgewählt. Es war vorerst am einfachsten zu implementieren. Ich werde wahrscheinlich auf einen stärker definierten Ansatz zurückgreifen müssen, da meine Anforderungen komplexer werden und die Anzahl der zu unterstützenden benutzerdefinierten Felder größer wird.