Frage

habe ich eine Tabelle in meiner Datenbank, die Datenfelder in einem benutzerdefinierten Formular darstellt. Die Datafield gibt einige Darstellung, welche Art von Kontrolle sollte es mit dargestellt werden, und welchem ??Wert Typ sollte es dauern. Vereinfachtes Sie können sagen, dass ich in dieser Tabelle 2 Einheiten haben - Textbox beliebigen Zeichenfolge nehmen und Textbox nur Zahlen nehmen.

Jetzt habe ich die unterschiedlichen Werte in einer separaten Tabelle gespeichert, Verweis auf die Datenfelddefinition. Was ist der beste Weg, hier den Datenwert zu speichern, wenn der Typ unterscheidet?

Eine mögliche Lösung ist das Fieldvalue Tabelle hält ein Feld pro möglichem Wert Typen zu haben. Nun wäre dies sicherlich überflüssig sein, aber zumindest würde ich den Wert in seiner korrekten Form gespeichert bekommen - Vereinfachung später Abfragen.

FieldValue
----------
Id
DataFieldId
IntValue
DoubleValue
BoolValue
DataValue
..

Eine andere Möglichkeit ist die Speicherung nur alles als String, und diese Abfragen in den Casting. Ich bin mit .Net mit NHibernate, und ich sehe, dass hier zumindest ein Projections.Cast ist, dass beispielsweise auf Guss verwendet werden kann, Zeichenfolge in der Abfrage in int.

So oder so in diesen beiden Lösungen, die ich wissen müssen, welche Art zu verwenden, wenn die Abfrage zu tun, aber ich werde die von der Datafield wissen, so dass nicht ein Problem sein.

Wie auch immer; Ich glaube nicht, dass diese Lösungen klingen gut. Sind sie? Oder gibt es einen besseren Weg?

War es hilfreich?

Lösung

Es gibt keine dritte „Magie“ Option. Ihre spezifische Situation bestimmt, wie Sie fortfahren möchten

Aus meiner Erfahrung eine String-only Lösung macht Sinn, mit Dingen wie Anwendungseinstellungen. Normalerweise brauche ich nicht solche Daten in Abfragen verwendet werden direkt, damit es nicht stört mich sehr, dass es in Form einer Zeichenfolge.

Ich bin nicht sicher, aber es scheint der Fall zu sein, dass Sie eine Entität mit benutzerdefinierten Attributen erweitern, die klingt wie Sie vielleicht irgendwann einige Verarbeitung in der Datenbank zu tun. In diesem Fall kann man als gut geht mit dem mehrspaltigen Ansatz und füllt nur in der Spalte mit der richtigen Art. Es ist nicht schön sein würde, aber es könnte Abfragen vereinfachen.

, sagte Wie ich, es hängt davon ab, ob und welche Art von Fragen, die Sie ausführen müssen, welche Art von Leistung, die Sie brauchen, etc.

Andere Tipps

Durch Ziehen an der Idee von Multi-Tenant-Datenspeicher, können Sie die 'Name-Pair' Werte Idee wie auf MSDN beschrieben. Ich denke, irgendwie, dass dieser Artikel wird nützlicher abgesehen von dem spezifischen Abschnitt zur Kenntnis genommen.

In der Tat, diese eine skalierbare Lösung zu machen, müssen Sie die Datentypen, für die benutzerdefinierte Form mit einem Metadatentabelle definieren, wobei Sie die tatsächliche Art der Daten definieren, die Sie speichern möchten (zB Bool, text, int , Terminzeit). Sie können sich auch als auch die .NET-Typ zu speichern, da diese in der Lage sein, Ihnen zu helfen, wenn es um die Überprüfung von Eingaben etc. Weitere Details kommt, die auch die Namen der Felder sind gespeichert werden können, wie Sie es erwarten, dass sie erscheinen Ihre individuelle Form. Mit diesem Ansatz Sie eine benutzerdefinierte Form bauen auf die gespeicherten Metadaten basieren.

Ich habe diesen Ansatz erfolgreich eingesetzt und es funktioniert super. Als Ergänzung verwenden wir auch die Metadatentabelle, ob der erwartete Wert für das benutzerdefinierte Feld zu definieren, Benutzer zur Verfügung gestellt (zB Name, Geburtsdatum) oder ein vordefiniertes Systemwert in Drop-downlist (zB einer Liste von citye, Ländern ). Um dies zu unterstützen, haben wir eine zusätzliche Tabelle, die Optionen für die Liste enthält, die zurück zu Metadatentabelle verknüpft.

Wenn Sie nur 2 Textfelder, dass der Benutzer Wert in eingeben kann, und es wird entweder ein String oder eine Zahl sein, haben Sie wirklich in der Lage sein müssen, zwischen int zu unterscheiden und Doppeln, können Sie nicht nur darauf speichern alle als geeigneter numerischer Typ (abhängig von der DB). Das würde man auf nur zwei verschiedene Arten erhalten und dann eine mögliche Lösung wäre, zwei Tabellen, eine für jede der beiden Typen.

Im Allgemeinen jedoch, wenn ich sehe, dass es schwierig ist, zu wissen, was Datentyp etwas sein wird, ich besorgniserregend starten würde, dass das Projekt zu Generika zu werden versucht, die eine Tendenz chaotisch zu werden hat recht.

Vor meiner Sicht bietet .. Ich würde sagen, dass Sie in die Notaufnahme Bord müssen zurück gehen. Ich nehme an, ein CustomForm hat viele Felder und diese Felder sind verschiedener Art (Text, Daten, vielleicht sogar Verhalten und Stil), anstatt das Konzept verallgemeinern Feld könnte es sich lohnen, anstatt für jede Art von Feld Erstellen einer Tabelle zu berücksichtigen. Z.B. Datefield, Benutzernameauszuwählen usw. Dies ist der Wert Typ genau eine Nicht-Null-Spalte mit dem richtigen Typ machen sein. Ich würde wetten, auch dies würde den Code vereinfachen (weniger Bedingungen zu überprüfen, die db gibt Ihnen alle Informationen.)

sagte, dass, können Sie nicht in der Lage sein, die ER Bord gehen zurück oder es möglicherweise zugrunde liegen triftige Gründe für das Erledigen der Mehrsäulen-per-Typ-Ansatz. Hier sind einige Vor-und Nachteile eines solchen Ansatzes.

Pros

  • alle in einer Tabelle, kann entpuppt, schneller zu sein (wenn auch daran denken, die Wurzel aller Übel ist ..)

Cons

  • DB kann das nicht erzwingen nicht mehr als ein Wert angegeben wird (extra Code Ausnahmen zu überprüfen)
  • DB kann nicht erzwingen, dass zumindest eine nicht NULL (extra Code für Fieldwerte ohne Wert zu überprüfen)
  • Add Unterstützung neuer Datentyp erfordert, dass alle vorhandenen Daten zu ändern (Hinzufügen von einem NULL-Wert auf Spalten).

Wenn Sie mit dem stecken CustomForm > Feld -> Fieldvalue Ich würde pro Tisch empfehlen die Erstellung Fieldvalue . z.

IntFieldValue
-------------
Id
DataFieldId
Value

DecimalFieldValue
-------------
Id
DataFieldId
Decimal


DateFieldValue
-------------
Id
DataFieldId
Date

Mit der oben Sie noch eine Ansicht, die wählt aus den obigen Tabellen erstellen können. Die Ansicht kann eine Spalte pro Wert Typen Angebot erstellt werden und Garantie , dass ein und nur einer von ihnen nicht NULL ist. Dies ist auch einfacher zu erweitern (eine neue Tabelle hinzuzufügen, die Ansicht ändern, aber es erfordert keine vorhandenen Daten mit Nullwerten für die neue Typen Spalte Aktualisierung).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top