Ich arbeite an einem SaaS, wo jeder Mieter mehrere Listen von Kontakten haben können, kann jede Liste eine beliebige Anzahl von Benutzerdefinierte Felder Kontakte dieser Liste können speichern und eine beliebige Anzahl von Gruppen die Contacts der Liste enthalten können (Gruppen werden für die Segmentierung Kontakte der Liste verwendet). Jeder Kontakt hat eine Pflichtfelder: email_address und eine beliebige Anzahl von benutzerdefinierten Feldern, die für die Liste definiert sind, wo es ist, wie ich erwähnt habe. Wir müssen Kontakte der Listen basierend auf den Gruppen, in denen sie sich befinden, und den Werten der benutzerdefinierten Werte finden können. Wir müssen bis zu 30 benutzerdefinierte Felder bereitstellen. Ich sehe jetzt drei Möglichkeiten, dieses Problem zu lösen:Wie benutzerdefinierte Felder und Gruppierung für die Multi-Tenant-Anwendung implementieren: EAV, feste Tabellen Muster, NoSQL
Mit Art von EAV (wir versuchen, es so zu tun), aber es sieht ziemlich komplex. Wir haben eine Tabelle Listen (Listen der Mieter), eine verwandte Tabellen custom_fields, eine verknüpfte Tabellen Abonnenten, die email_addreses von Abonnenten der Liste, Tabelle subscribers_custom_data gespeichert, die mit Abonnenten und custom_fields Tabellen (gespeicherten Werte der benutzerdefinierten Felder von verwandt die Abonnenten).
Feld Tabellen Muster. Die Beschreibung davon ist hier http://blog.springsource.com/arjen/archives/2008/01/24/storing-custom-fields-in-the-database/. In diesem Fall würden wir ein Feld für benutzerdefinierte Felder verwenden, die alle benutzerdefinierten Felder in Spalten speichern würden, z. B. 30 Spalten zum Speichern von Werten für alle möglichen benutzerdefinierten Felder und eine Tabelle zum Speichern der Zuordnung von Spaltenname und Name des Benutzers definiertes Feld Es sieht auch komplex aus. Wir müssten mindestens 30 Indizes haben, um nach den Werten von benutzerdefinierten Feldern zu suchen, dort auch andere Probleme,
Um eine Art von NoSQL-Datenbank zumindest für das Speichern von benutzerdefinierten Feldern und vielleicht Gruppen von Die Liste. Denken Sie, dass solche Datenbanken hier helfen können und wenn ja, wie Sie benutzerdefinierte Felder und Gruppen speichern. Ich versuche, verschiedene Arten von NoSQL zu betrachten, zum Beispiel dokumentorientiert wie MongoDb, aber sofort kann ich nicht sehen, wie es helfen kann, dieses Problem zu lösen. Wir können hier beliebige Attribute speichern, aber um nach den Werten der benutzerdefinierten Felder zu suchen, müssen wir sie im Voraus indizieren, damit wir wissen, welche benutzerdefinierten Felder wir haben.
Vielen Dank für weitere Informationen.
Mit meinem Anwendungsfall kann ich die indexierbaren Felder kennen (aber nur zur Laufzeit). Die Mieter sind in der Lage, ihren eigenen Feldsatz zu definieren (indem sie aus einem Satz von vordefinierten auswählen und/oder ihre eigenen Felddeskriptoren hinzufügen). Wenn sie zu diesem Zeitpunkt ein neues Feld hinzufügen, sollte ich eine (spärliche) Indexerstellung auslösen können. Würde also für dieses spezielle Szenario ein dokumentenorientierter Laden am besten passen? –
Ja, ein Dokumentenspeicher könnte in dieser Situation funktionieren. Siehe meine Bearbeitung oben. –
Wie zur Verwendung von Blob ist es nicht klar, wie benutzerdefinierte Felder gelöscht/bearbeitet werden. Zum Beispiel kann der Benutzer ein Feld in seinem Container löschen und das Feld sollte in allen Entitäten dieses Containers gelöscht werden. Können Sie mir bitte sagen, wie Sie benutzerdefinierte Felder löschen/bearbeiten und in allen Entitäten widerspiegeln? Neben dem Hinzufügen/Löschen von benutzerdefinierten Feldern zum Beispiel sollte es verfügbar machen und filtern. Falls EAV Kaskade gelöscht wird passiert. Die Größe eines Feldes ist begrenzt und es ist schwer vorherzusagen, wie groß die Blobgröße sein wird. Aber es ist schwer zu sagen, ob Nosql irgendwelche Vorteile geben kann. – Oleg