2016-09-06 7 views
0

Ich möchte einen Teil meines Systems organisieren, aber ich kann nicht bequemes Formular für die Datendarstellung für die Interaktion mit meiner App wählen. So habe ich einige lokale „Repository“ des Datenobjekts, descripted wie folgt:Datenbank von schwach typisierten Objekten

Object1 
{ id = TypeId, field1 = value1, otherObjectSpecifedField = value2 ... } 
... 

Es gibt viele Objekte (zB 1000) von vielen Arten (zum Beispiel 50). Jeder Typ hat seine eigene UniqueId und seine eigene Beschreibung und Reihe von Feldern.

Nächste Sache ist, dass für jede Objekt ich habe eine Reihe von Filtern, die diesem Objekt entspricht, ist tatsächlich im Moment. Es sieht wie folgt aus:

Filter 
{ filterName1 = filterValue, filterName2 < filterValue } 
Object // filter is applied for this object 
{ ... } 

Der Prozess dieses "Repository" verwenden:

  1. In meiner app ich habe Anwendung Staaten, die Filter von oben bedeutet. Beispiel: Anwendung Lokalisierung kann seine ‚de‘ (meine Anwendung diesen Wert kennt und kann es beim Start aus), und wir haben Filter, mit dem Namen ‚Lokalisierung‘ und in unserem Repository können wir es wie folgt verwenden: Filter { localization = 'en'} Object1 { ... } // this object i should choose when localization is en

  2. Wenn meine App beschließt, gerade zu überprüfen, welcher Satz von Objekten gerade aktuell ist, kommt sie ins Repository und fragt: "Hier ein TypeId und bitte, gehen Sie durch jedes Filter + Objektpaar und sagen Sie, welches Objekt durch Filter tatsächlich ist einige Filterwerte auflösen (Lokalisierung von Beispiel oben) ich werde sie für Sie auflösen ".

  3. Dann Repository-Wanderungen durch jedes Objekt und vergleichen, was ist aktuell durch Filter, und das ist nicht und tatsächlich auf App geben. Also prüft er jeden Filter jedes Objekts und gibt es nur, wenn alle von ihnen tatsächlich sind und er es in der Laufzeit tat.

In der aktuellen Implementierung dieser Satz von fiters + Objekte in XML-Datei in sehr spezifischen XML-Format gespeichert, die bequem von App zu lesen ist, aber sehr schwer von Mensch zu pflegen. Und ich denke, dass es einen Platz zur Optimierung aller Prozesse gibt. Ich denke, wir können es schaffen, durch Objekte zu gehen und sie mit anderen zu vergleichen. Jetzt denke ich in der Seite von NoSQL dokumentenorientierten Datenbanken. Weil jedes Objekt seine einzigartige Struktur hat und vielleicht eine Auswahlroutine verwendet, kann ich wählen, was ich brauche.

Vielleicht hat jemand irgendwelche Vorschläge über diese Art von Datenbankorganisation? Vielleicht kennen Sie eine bestimmte Datenstruktur für diese Art von Daten?

Antwort

0

Vielleicht habe ich etwas verpasst, weil es für mich aussieht, als ob Sie eine Reihe von verschiedenen Arten von Objekten haben: einen Typ per TypeId. Wenn das so ist, dann denke ich, dass dies mit einer Standard-SQL-Datenbank geschehen kann, vorausgesetzt, dass die Felder innerhalb eines Objekts einen konsistenten Typ haben. Wenn nicht, kann es immer noch mit einer NoSQL-Datenbank gemacht werden.

In einer SQL-Datenbank würden Sie für jeden Typ eine separate Tabelle verwenden (da sie jeweils eigene Felder haben) und in der entsprechenden Tabelle mit SQL suchen.So zum Beispiel können Sie eine Tabelle mit zwei Feldern erstellen (Ich bin hier SQLite, die nicht Typen für Felder erfordern):

create table Object1 (field1, otherObjectSpecifiedField); 

Diese Tabelle kann dann Daten in sie eingefügt haben:

insert into Object1 values ("field1value", "otherfieldValue"); 

Filterung verwendet Standard-SQL:

select * from Object1 where field1 = "field1value"; 

wie ich bereits erwähnt, kann dies auch mit einer NoSQL-Datenbank wie MongoDB getan werden könnte. in etwa so aussieht in der Mongo CLI Das würde:

erstellen Tabelle und legen erstes Objekt:

db.test.insert({ id: "TypeId", field1: "value1", otherObjectSpecifedField: "value2"}); 

Wählen Sie ein Objekt aus der Tabelle:

db.test.find({id: "TypeId", field1: "value1"}); 
/* { "_id" : ObjectId("57cf97060216d33b891615ba"), "id" : "TypeId", "field1" : "value1", "otherObjectSpecifedField" : "value2" } */ 
Verwandte Themen