2009-06-07 2 views
5

Ich muss Benutzern erlauben, neue Felder zu einem Datensatz hinzuzufügen, z. Wenn ein Kontaktdatensatz vorhanden ist, möchte ein Benutzer möglicherweise ein numerisches "SSN" -Feld und ein "Geburtsdatum" -Kalenderfeld hinzufügen. Sie würden dies natürlich über die Benutzeroberfläche tun.Wie würden Sie benutzerdefinierte Felder in einer SQL-Datenbank erstellen und speichern?

Diese Felder sollten dann für alle Kontaktdaten verfügbar sein.

Anbetracht dessen, dass meine Bewerbung für viele Benutzer gleichzeitig ausgeführt wird (kein Einzelfirmen Einsatz etc.) und könnte theoretisch jeder seine eigene Felder hinzufügen, was die beste Praxis wäre, diese Informationen in einer Datenbank zu speichern, vor allem, wenn es muss durchsuchbar sein?

+1

, ich glaube, Sie‘ Sie bitten um Ärger, indem Sie einzelne Benutzer während des Betriebs nach ihren Anforderungen fragen. Wenn Sie zum Beispiel 10 Personen haben, die die gleichen Informationen benötigen, aber 10 verschiedene Arten benennen, haben Sie eine große Komplexität für wenig Nutzen. Es könnte besser sein, sich mit den Nutzern zu treffen und zu einem Konsens zu kommen, als Dinge ad-hoc zu tun. –

+0

Sie sind zu 100% richtig. Ich bin jedoch mit dieser Anforderung stecken :( – Alex

+0

Ich habe dies in vielen Anwendungen zu erreichen, wenn Sie diese Art von Anforderung implementieren, ist es sehr schwierig, aber das gibt mehr Flexibilität für den Benutzer benutzerdefinierte Felder hinzufügen –

Antwort

1

Wir fügen fast in alle unsere Anwendung/Produkte zusätzliches Attribut/Feld Unterstützung für gegebene Flexibilität Benutzer
Wie wir eine Produktkategorie haben, in der Kategorie, kann der Kunde definieren zusätzliches Attribut eines Produkts
, was wir tun in der DB-Ebene ist:
Kategorie Tabelle haben einige zusätzliche Spalte wie: Text1Att, Text2Att ... für Text-Wert-Unterstützung, Num1Att, Num2Att ... für Anzahl Wert Unterstützung, Date1Att, Date2Att ... für Datetime Wert Unterstützung, ID1Att , ID2Att ... Unterstützung für ID aus anderen Tabellen, wie Sie Dropdown, Listbox, ... hinzufügen können
Hier haben alle Spalten String-Datentyp.
was wir speichern hier ist

wir hier Meta-Informationen gespeichert werden, wie für Text1Att meta
SSN; Textbox; 50; true; false; Null;
Beschriftung des Felds; Steuerelementtyp; Maximale Länge; ist Pflichtfeld; ist benutzerdefinierte Überprüfung erforderlich; Benutzerdefinierte Validierungsnachricht;
Geburtsort; Textbox; 100; wahr; wahr; Ungültiger Wert;
Das Gleiche gilt für Zahlenfeld ...
für Datum wird Metainformationen aussehen
Geburtsdatum; Kalender Kontrolle; true; true; Ungültiges Datum;
Beschriftung des Feldes; Kalender-Steuerelement oder kann andere sein, ist erforderlich, ist benutzerdefinierte Validierung; Benutzerdefinierte Validierungsnachricht;


Was in Produkttabelle tun, ist dieselbe Anzahl von Spalte hinzufügen und Datentyp text1Att haben, .. ist varchar, num1Att haben numerisch, date1Att Datumzeit haben, ID1Att int haben

Was wir GUI Seite tun ist: Fügen Sie dieses Attribut auf der Kategoriedefinitionsseite hinzu und erstellen Sie Metainformationen zur Laufzeit und speichern Sie in der Kategorietabelle
. Wenn wir das Produkt in der Kategorie definieren, werden Metainformationen aus der Kategorietabelle gelesen und durchlaufen wie andere Felder in der Produktdefinitionsseite .


wenn u weitere Hilfe benötigt, kann ich Ihnen Bilder zur Verfügung stellen, damit Sie besser verstehen, wie dies getan werden kann.
wir Erfahrung und analysieren, das ist viel flexiblerer Ansatz

+1

Obwohl diese Lösung "hässlich" erscheint, ist sie in Bezug auf die Durchsuchbarkeit viel besser. Wenn Sie so vorgehen, wie in der akzeptierten Antwort beschrieben, ist es sehr teuer (in Bezug auf die Leistung), nach vielen Feldern zu suchen. –

+0

Ja, Images/& Pseudocode wäre wirklich hilfreich. Vielen Dank! – Alex

10

Haben Sie eine Tabelle, die die Feldnamen und -typen speichert.

field_ID  INT 
field_name VARCHAR 
field_type ENUM('int','float','text','richtext') 

Haben Sie eine Tabelle, die einen Link zu einem Eintrag in der Datensatztabelle, ein Link zu einem Eintrag in der Feldtabelle und der Feldwert speichert.

fieldvalue_fieldID INT 
fieldvalue_recordID INT 
fieldvalue_value  BLOB 

durchsuchbar zu machen ist eine weitere Herausforderung - Sie würden, dass jeder durchsuchbaren Inhalte aus diesem fieldvalue_value und Index greifen müssen. Dies wäre datenbankspezifisch. In MySQL könnten Sie einen TEXT-Wert angeben und einen MySQL-FULLTEXT-Index hinzufügen.

+0

Angesichts Ihrer Anforderung ist dies wahrscheinlich die einfachste Art und Weise, Dinge zu tun. Viel Glück. –

+1

Ach ja, das EAV anti-Muster. –

+1

Mehr Informationen [hier] (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2 % 80% 93value_model) und [hier] (http://programmers.stackexchange.com/questions/93124/eav-is-it-really-bad-in-all-scenarios) – thomasrutter

1

Ihre besten Optionen sind:

  1. der Benutzer erlauben, ihr eigenes Datenbankschema zu ändern, vielleicht durch einen Modul hochladen oder ein Skript ausgeführt wird.

  2. Verwenden Sie ein XML-Feld, und eine Datenbank, die Indizes und Abfragen über den Inhalt dieses Feldes

Diese werden empfohlen von Martin Fowler, hier unterstützt: Ehrlich gesagt http://martinfowler.com/bliki/UserDefinedField.html

Verwandte Themen