Ich habe mehrere Anwendungen, von denen einige Daten aus denselben Quellen verwenden. Ist es empfehlenswert (oder was sind die Vor- / Nachteile), um:
Belassen Sie die Daten in Datenbanken, die von mehreren Anwendungen gemeinsam genutzt werden
- Spart Platz, da nur eine Datenbank benötigt wird
- erschwert die Indizierung, da unterschiedliche Anwendungen unterschiedliche Abfrageanforderungen haben
Täglich Daten in App-Datenbanken importieren
- Verwendet mehr Speicherplatz, da doppelte Daten in Datenbanken pro App vorhanden sind
- Einfachere Indizierung, da sich jede App auf ihre individuellen Bedürfnisse konzentrieren kann
Ich habe möglicherweise andere Vor- und Nachteile ausgelassen, bitte führen Sie diese auf, falls vorhanden. Wie wird dies auch an Ihrem Arbeitsplatz durchgeführt?
Antworten:
Speicherplatz ist heutzutage billig, daher würde ich empfehlen, eine Datenbank pro Anwendung zu verwenden.
Die gemeinsame Nutzung einer Datenbank für mehrere Anwendungen hat einige schwerwiegende Nachteile :
Je mehr Anwendungen dieselbe Datenbank verwenden, desto wahrscheinlicher ist es, dass Sie Leistungsengpässe feststellen und die Last nicht einfach wie gewünscht skalieren können . SQL-Datenbanken skalieren nicht wirklich. Sie können größere Maschinen kaufen, aber sie lassen sich nicht gut in Clustern skalieren!
Die Wartungs- und Entwicklungskosten können steigen : Die Entwicklung gestaltet sich schwieriger, wenn eine Anwendung Datenbankstrukturen verwenden muss, die nicht für die jeweilige Aufgabe geeignet sind, aber so verwendet werden müssen, wie sie bereits vorhanden sind. Es ist auch wahrscheinlich, dass Anpassungen einer Anwendung Nebenwirkungen auf andere Anwendungen haben ("Warum gibt es so einen unnötigen Auslöser?!" / "Wir brauchen diese Daten nicht mehr!"). Es ist schon schwer mit einer Datenbank für eine einzelne Anwendung, wenn die Entwickler nicht alle Anwendungsfälle kennen / können.
Verwaltung wird schwieriger: Welches Objekt gehört zu welcher Anwendung? Chaos Rising. Wo muss ich nach meinen Daten suchen? Welcher Benutzer darf mit welchen Objekten interagieren? Was kann ich wem gewähren?
Aktualisieren: Sie benötigen eine Version, die für alle Anwendungen, die sie verwenden, den niedrigsten gemeinsamen Nenner aufweist. Das bedeutet, dass bestimmte Anwendungen keine leistungsstarken Funktionen verwenden können. Sie müssen sich an ältere Versionen halten. Es erhöht auch die Entwicklungskosten ein wenig.
Nebenläufigkeit: Können Sie wirklich sicher sein, dass es keine chronologischen Abhängigkeiten zwischen Prozessen gibt? Was passiert, wenn eine Anwendung Daten ändert, die veraltet sind oder die zuerst von einer anderen Anwendung geändert wurden? Was ist mit verschiedenen Anwendungen, die gleichzeitig an denselben Tabellen arbeiten?
Im Vergleich dazu sind Datenimporte / ETL-Prozesse fast immer recht unkompliziert und einfach. Laden Sie die Daten so oft Sie möchten, der Speicherplatz ist günstig. Sie können die Skalierbarkeit für jede Anwendung unabhängig voneinander berücksichtigen, die Strukturen nach Bedarf anpassen und optimieren, ohne dass Probleme mit der Parallelität auftreten. Nebenwirkungen können auch viel einfacher verfolgt werden.
Bearbeiten: Ich möchte jedoch darauf hinweisen, dass es, wie bei @Saeed erwähnt, einfacher ist, eine Datenbank für mehrere Anwendungen freizugeben, wenn Sie Datenmanipulationen in einem allgemein verfügbaren Dienst kapseln können. Solange Sie keinen unformatierten Zugriff benötigen, ist dies ein sehr guter Ansatz.
quelle
Ich hatte einmal eine ähnliche Situation. Mein Problem bestand darin, drei Anwendungen zu erstellen, eine für die Bestandsverwaltung, eine für die Beschaffungsverwaltung und eine für die Verwaltung von Benutzern, dh Mitarbeitern. Meine Empfehlung lautet, Datenbanken nicht pro Anwendung physisch zu unterbrechen oder sie pro Anwendung physisch zu verbinden. Vielmehr funktioniert die logische Trennung meiner Meinung nach besser.
Beispielsweise müssen alle drei Anwendungen mit Mitarbeiterinformationen arbeiten. Sowohl das Inventar als auch das Beschaffungssystem verwendeten dieselben Informationen von Waren und Inventargegenständen.
Ich habe eine gemeinsame Datenbank erstellt, in der ich die Informationen von Benutzern und Waren gespeichert habe. Dann habe ich eine Service-Schicht darauf aufgebaut und diese Services in anderen Anwendungen verwendet. Um zum Beispiel eine Liste aller Mitarbeiter anzuzeigen, die jetzt im Unternehmen sind, musste ich nur eine Methode aus dem Service aufrufen, wie
GetOnWorkEmployees()
.Ich habe auch eine gemeinsame Benutzeroberfläche für die Interaktion mit Benutzern und Waren erstellt, die eine eigene Webanwendung war.
Als Ergänzung zu dem, worauf @Falcon hingewiesen hat, können Sie meines Erachtens von der Zentralisierung der gemeinsamen Funktionen von Anwendungen in einer Datenbank profitieren.
quelle
Wenn diese Anwendungen mit denselben Daten arbeiten sollen, z. B. mit derselben Liste von Produkten und Kunden, halten Sie die Datenbank zusammen. Sie erhalten nichts, wenn Sie die Datenbanken trennen. Das ist ein rein menschliches Problem - für den Server sind es nur Bytes auf einer Festplatte. Es ist ihm egal, ob es 1 oder 100 Datenbanken sind. Wenn Sie es jedoch aufteilen, müssen Sie sich mit der Datensynchronisation befassen. Die von Ihnen angesprochenen Indizierungsprobleme sind kein wirkliches Problem - Sie würden die gleiche Prozessorzeit für die Pflege der Indizes aufwenden, wenn die Datenbanken aufgeteilt würden.
Wenn die Leistung zu einem Problem wird, replizieren Sie die Datenbank auf mehrere Server, um das Problem auszugleichen.
quelle
Möglicherweise lohnt es sich in Ihrer Situation, einen Kompromiss einzugehen, aber die Aufrechterhaltung der Datenintegrität ist mit einer einzigen Datenbank einfacher. Zumindest in MS SQL Server können Sie keinen Fremdschlüssel von einer Datenbank in eine andere Datenbank kopieren. Sie können das Verhalten von Fremdschlüsseln mit Triggern simulieren, dies ist jedoch nicht besonders elegant.
Darüber hinaus kann das Erstellen lokaler Kopien der Daten gefährlich sein, wenn Schreibvorgänge ausgeführt werden. Wenn AppA und AppB über eine Kopie einiger freigegebener Daten verfügen und diese von AppA aktualisiert werden, werden in AppB weiterhin die alten Daten gespeichert. Oder Sie müssen Trigger einrichten, um die Daten synchron zu halten.
quelle
Einmal hatte ich mehrere Websites, die im Laufe der Zeit populär wurden. Sie verwendeten separate Datenbanken, hauptsächlich, weil der Hosting-Anbieter jeweils nur 1 GB Speicherplatz zuließ. Aber! Sobald ich einen Dienst herausgebracht hatte, der alle diese Websites umfasste, musste ich Transaktionen zwischen diesen Websites durchführen. Der bequemste Weg, dies zu tun, ist definitiv, alles in eine einzige große Datenbank zu verschieben.
Also habe ich die Datenbankstruktur optimiert und die relevanten Teile in diese zentrale Datenbank gepackt, aber alles andere weggelassen.
Meine Meinung hängt irgendwie mit den Paradigmen von OOP zusammen. Ähnliche Daten müssen zusammen gespeichert werden. Wenn Sie also unterschiedliche Anwendungen erstellen, sollten Sie unterschiedliche Datenbanken für diese verwenden.
In dem obigen Fall konnte die Verwendung von Common DB nicht vermieden werden, aber denken Sie daran, dass ich auch einige Tabellen in einer separaten DB getrennt hielt, die nicht Teil der allgemeinen Abfragen sind.
Wenn Sie sie getrennt aufbewahren, sind sie außerdem einfacher zu sichern, und es besteht eine geringere Wahrscheinlichkeit für Datenverlust. Wenn etwas schief geht und Anwendungen sich gegenseitig stören, ist die Datenbank durcheinander und Sie möchten Ihre App im Grunde nicht dieser Gefahr aussetzen.
Alles in allem können Sie eine gemeinsame Datenbank für allgemeine Abfragen verwalten, aber auch eine für jede Ihrer Anwendungen.
quelle
Können Sie mehr über Ihre Anwendungsarchitektur herausfinden?
Wenn Ihre Datenbank nur als Datenrepository ohne Anwendungslogik wie Trigger oder Business Package Code fungiert, ist es besser, eine einzige Datenbank zu haben und Funktionen auf Unternehmensebene für Dienste zu kapseln, die die Datenbank für alle ihre Aktionen verwenden. Wenn Sie Trigger oder Code im Datenbankschema haben, werden Sie durch die Verwendung einer einzelnen Datenbank in große Schwierigkeiten geraten, was in vielen Fällen problematisch sein kann.
quelle