2010-10-11 13 views
8

Ich habe versucht, ein komplexes Mysql-Datenstrukturproblem für benutzerdefinierte Felder für eine Online-App zu beantworten. Ich bin ziemlich neu in Mysql, so dass jede Eingabe geschätzt wird.Array, EAV, serialisiertes LOB für benutzerdefinierte Felder?

Die aktuelle Datenbank ist eine relationale Datenbank und jeder Benutzer des Dienstes wird dieselbe Datenbank und dieselben Tabellen verwenden.

Hier ist ein Beispiel für das, was ich versuche zu tun.

Sagen wir, ich versuche, eine Liste zu erstellen. Diese Liste kann bis zu 30 benutzerdefinierte Felder enthalten. Der Benutzer kann zwischen 12 eindeutigen Elementen wählen und jedes Element kann bis zu 15 benutzerdefinierte Attribute haben.

Jede Liste kann sowohl innerhalb eines Kontos als auch zwischen Konten eindeutig sein. Konten können zahlreiche Listen haben und jede Liste kann unterschiedliche Mengen an Elementen sowie unterschiedliche Attribute pro Element aufweisen.

Ein Element kann viele Dinge, zum Beispiel: Multiple Choice, Optionsfeld, Telefonfeld, Adresse, einzelne Zeile Text, Text mit mehreren Leitungen usw.

Ein Beispiel für Attribute für einen Multiple-Choice (Checkbox) Element könnte sein: rot, grün, blau, orange, weiß, schwarz

Ein Beispiel für ein einzeiliges Textelement könnte sein: Vorname Eingabefeld.

Jedes Element muss auch ein benutzerdefiniertes Titel- und Tag-Feld enthalten, auf das verwiesen und in anderen Funktionen der App verwendet werden kann.

Segmentierung ist sehr wichtig. Ein Benutzer muss in der Lage sein, eine Liste basierend auf einem beliebigen Element zu segmentieren. Beispielsweise könnte ein Benutzer die Liste "ABC" basierend auf allen Datensätzen segmentieren wollen, bei denen "rot" in dem Mehrfachauswahlelement # 1 vorhanden ist (sie können mehr als ein Mehrfachauswahlelement für eine Liste aufweisen).

In diesem Beispiel würde ich davon ausgehen, dass Arrays, EAV, Serialized LOB würde gut funktionieren. Ich bin mir jedoch nicht sicher, was die beste Struktur für meine Bedürfnisse in meiner Größenordnung wäre.

In der Realität wird es höchstwahrscheinlich bis zu 50.000 Datensätze pro Liste geben und es gibt eine echte Möglichkeit von mehr als 20.000 Konten - jede mit zahlreichen Listen. Daher suche ich nach der effizientesten und flexibelsten Struktur.

Um die Dinge noch komplexer zu machen, muss ich auch eine effiziente Möglichkeit zum Hinzufügen/Löschen von Elementen zu einer beliebigen bestimmten Liste zu einer bestimmten Zeit sicherstellen. Wenn ein Benutzer beispielsweise eine Liste mit der maximal zulässigen Anzahl benutzerdefinierter Felder (30) erstellt und drei Monate später entscheidet, dass er ein Feld löschen möchte, muss ich diese Liste und alle zugehörigen Werte für dieses benutzerdefinierte Feld finden und Löschen Sie dann alle Werte, den Elementtyp und seine Attribute. Der Benutzer könnte dann ein neues Element zu dieser Liste hinzufügen.

Ich habe viele der EAV-Beiträge auf dieser Website, sowie diese http://www.martinfowler.com/eaaCatalog/serializedLOB.html überprüft Es scheint nicht, dass EAV würde sehr effizient für meine Bedürfnisse aufgrund der Datenbeschaffung Nachteile.

Ich fragte mich auch, wie gut ein mehrdimensionales Array in diesem Maßstab funktionieren würde? Ich glaube, Wordpress verwendet dies für ihre benutzerdefinierten Felder.

Jede Eingabe würde sehr geschätzt werden, wie die Datenbank für diese Situation am besten strukturiert wird. Vielen Dank!

+0

Ich stehe auch vor der gleichen Herausforderung - mit welcher Lösung sind Sie gegangen? Ich würde mich sehr für deine Erfahrungen interessieren. – philwilks

Antwort

0

Sie können JSON Encoding und Decoding verwenden (ich nehme an, Sie verwenden PHP), um die Eingabeinformationen in einer Tabelle mit einer Spalte zu speichern, um den Benutzer zu speichern und andere, um diese Daten als Text zu speichern. Die Antworten müssen in einer anderen Tabelle gespeichert werden (mit einem FK, um CASCADE ON DELETE zu verwenden).

Wenn Sie die maximale Größe der Eingabespezifikation angeben können, verwenden Sie ein varchar-Feld.

Dies kann nicht der beste Weg sein (einige Profiling-Tests, um sicherzustellen, dass es robust genug ist) kann aber sicher verwendet werden.

1

Sie lesen können, wie Friend implementiert benutzerdefinierte Felder: http://bret.appspot.com/entry/how-friendfeed-uses-mysql

Sie verwenden eine Kombination von serialisierten LOB, mit zusätzlichen Tabellen invertierten Indizes enthalten. Sie benötigen keine zusätzliche Tabelle für jedes mögliche Attribut in Ihrem LOB, sondern nur diejenigen, nach denen Sie mithilfe eines Index suchen möchten.

+0

http://bret.appspot.com/entry/how-friendfeed-uses-mysql wurde nicht gefunden –

+0

@wangyiran, nicht überraschend, dass Blog über 6 Jahre alt ist. Ich beschreibe die gleiche Technik der invertierten Indexierung in meiner Präsentation hier: http://www.slideshare.net/billkarwin/extensible-data-modeling. –

Verwandte Themen