2009-07-23 14 views
3

Ich baue ein Tool, das Menschen anhand einer Reihe von Attributen sucht. Die Werte für diese Attribute sind auf mehrere Systeme verteilt.Strategien für die Suche über verschiedene Datenquellen

Als Beispiel wird dateOfBirth in einer SQL Server-Datenbank als Teil von System ABC gespeichert. Die Verkaufsregionenzuweisung dieser Person wird in einer schrecklichen Legacy-Datenbank gespeichert. Andere Attribute werden in einem System gespeichert, auf das nur über einen XML-Webdienst zugegriffen werden kann.

Erschwerend kommt hinzu, dass die alte Datenbank und der Webdienst sehr langsam sein können.

Welche Strategien und Tipps sollte ich für die Implementierung einer Suche über alle diese Systeme berücksichtigen?

Hinweis: Obwohl ich eine Antwort geschrieben habe, bin ich nicht zuversichtlich, dass es eine gute Antwort ist. Ich beabsichtige nicht, meine eigene Antwort zu akzeptieren, es sei denn, niemand gibt mir einen besseren Einblick.

Antwort

4

Sie könnten einen Indizierungsmechanismus zum Abrufen und lokalen Indizieren der Daten über alle Systeme in Betracht ziehen und dann Ihre Suchen mit dem Index durchführen. Die Suche wäre sehr viel schneller und zuverlässiger.

Natürlich verschiebt dies das Problem nur von einem Teil Ihres Systems zu einem anderen - jetzt muss Ihr Indexierungsmechanismus mit Fehlern und heterogenen Systemen umgehen, aber das ist vielleicht ein einfacher zu lösendes Problem.

Ein weiterer Faktor ist, wie oft sich die Daten ändern. Wenn Sie Daten in Echtzeit abfragen müssen, die sehr schnell veralten, ist die Indexierung möglicherweise nicht praktikabel.

1

Wenn Sie mit einer restriktiven Suche durchkommen können, geben Sie zunächst eine Liste basierend auf den Suchkriterien zurück, die der schnellsten Datenquelle entsprechen. Fügen Sie dann diese Datensätze den anderen Systemen hinzu und entfernen Sie Datensätze, die nicht mit den Suchkriterien übereinstimmen.

Wenn Sie OR Logik implementieren müssen, wird dieser Ansatz nicht funktionieren.

1

Obwohl dies keine wirkliche Antwort ist, könnte dies zumindest zu einer praktikablen Lösung führen. Wir hatten eine ähnliche Situation bei einem früheren Arbeitgeber - viele Datenquellen, unterschiedliche Zugriffsmöglichkeiten auf diese Datenquellen, unterschiedliche Zugriffsberechtigungen, militärische/Regierungs-/zivile Quellen usw. Wir verwendeten Mule, die auf dem Enterprise Service Bus-Konzept basiert, um diese Datenquellen mit unserer Anwendung zu verbinden. Meine Details sind ein wenig skizzenhaft, da ich nicht der eigentliche Implementor war, sondern nur ein Integrator, aber wir haben einen Kanal in Mule definiert. Dann schreiben Sie ein einfaches Integrationsstück zwischen dem Kanal und der Datenquelle und der Anwendung und dem Kanal. Der Integrationsteil erledigt die eigentliche Abfrage und formatiert die Ergebnisse, so dass wir eine generische SQL-Integration für den Zugriff auf eine Datenbank hatten. Für Dinge wie Webdienste hatten wir einige Basisklassen, die allgemeine Funktionalität implementierten, also die eigentliche Die Anpassung des Integrationspakets war viel weniger Arbeit, als es sich anhört. Die Anwendung könnte dann den Kanal abfragen, der den Zugriff auf die verschiedenen Datenquellen handhabt, diese in ein normalisiertes Bit von XML transformiert und die Ergebnisse an die Anwendung zurückgibt.

Dies hatte eine Menge Vorteile für unsere Situation. Wir könnten neue Datenquellen für bestehende Abfragen hinzufügen, indem wir sie einfach mit dem Kanal verbinden - die Anwendung musste nicht wissen oder sich darum kümmern, welche Datenquellen dort waren, da sie nur die Daten aus dem Kanal betrachtete. Da Daten aus dem Kanal gepusht oder abgerufen werden können, könnte eine Datenquelle die Anwendung aktualisieren, wenn sie beispielsweise aktualisiert wurde.

Es hat eine Weile gedauert, bis es konfiguriert war und funktionierte, aber sobald wir es in Gang gebracht hatten, waren wir ziemlich erfolgreich damit.In unserem Demo-Setup hatten wir 4 oder 5 Anwendungen, die sowohl als Produzenten als auch als Konsumenten von Daten fungierten und Verbindungen zu etwa 10 Datenquellen knüpften.

+0

ich mag diese idee am besten, obwohl es eine viel einfachere geben könnte. – djangofan

0

Haben Sie daran gedacht, die Daten in eine separate Struktur zu verschieben?

Zum Beispiel speichert Lucene zu durchsuchende Daten in einem schemalosen invertierten Index. Sie könnten ein separates Programm haben, das Daten aus all Ihren verschiedenen Quellen abruft und in einen Lucene-Index legt. Ihre Suche könnte gegen diesen Index arbeiten und die Suchergebnisse könnten eine eindeutige ID und das System enthalten, aus dem sie stammen.

http://lucene.apache.org/java/docs/ (Es gibt Implementierungen in anderen Sprachen als auch)

0

Haben Sie einen Blick auf YQL genommen? Es ist vielleicht nicht die perfekte Lösung, aber ich könnte Ihnen den Ausgangspunkt geben, um zu arbeiten.

0

Nun, für den Anfang würde ich die Abfragen auf die verschiedenen Systeme parallelisieren. Auf diese Weise können wir die Abfragezeit minimieren.

Sie könnten auch darüber nachdenken, die Suchattribute für nachfolgende Abfragen zwischenzuspeichern und zu aggregieren, um die Dinge zu beschleunigen.

Sie können einen Aggregationsdienst oder eine Middleware erstellen, die alle verschiedenen Systeme aggregiert, sodass Sie eine einzige Schnittstelle für die Abfrage bereitstellen können. Wenn Sie das tun, würde ich den zuvor erwähnten Cache tun und Optimierungen parallelisieren.

Bei all dem müssen Sie jedoch die Entwicklungszeit/Bereitstellungszeit/langfristigen Nutzen der Bemühungen abwägen, um die alte Legacy-Datenbank auf eine schnellere moderne zu migrieren. Sie haben nicht gesagt, wie diese Datenbanken in andere Systeme eingebunden sind, so dass es auf kurze Sicht keine sehr brauchbare Option ist.

EDIT: als Reaktion auf veraltete Daten. Sie können Caching in Erwägung ziehen, wenn Ihre Daten nicht immer in Echtzeit mit der Datenbank übereinstimmen müssen. Wenn sich einige Daten nicht sehr oft ändern (z. B. Geburtsdaten), sollten Sie sie zwischenspeichern. Wenn Sie Caching verwenden, können Sie Ihr System konfigurierbar machen, welche Tabellen/Spalten aus dem Cache ein- oder ausgeschlossen werden sollen, und Sie könnten jeder Tabelle/Spalte ein personalisierbares Cache-Timeout mit einem Gesamtstandard geben.

0

Verwenden Pentaho/Kettle alle Datenfelder kopieren, die Sie auf und zeigen in eine lokale MySQL-Datenbank
http://www.pentaho.com/products/data_integration/

Erstellen Sie eine Batch-Skript jede Nacht laufen suchen können und die lokale Kopie zu aktualisieren. Vielleicht sogar jede Stunde. Schreiben Sie dann Ihre Abfrage in Ihre lokale MySQL-Datenbank und zeigen Sie die Ergebnisse an.

Verwandte Themen