Soll ich eine Datenbank pro Anwendung verwenden oder eine einzelne Datenbank für mehrere Anwendungen freigeben [geschlossen]


33

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

    1. Spart Platz, da nur eine Datenbank benötigt wird
    2. erschwert die Indizierung, da unterschiedliche Anwendungen unterschiedliche Abfrageanforderungen haben
  • Täglich Daten in App-Datenbanken importieren

    1. Verwendet mehr Speicherplatz, da doppelte Daten in Datenbanken pro App vorhanden sind
    2. 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?


1
Wie definieren Sie die Anwendung: separate Builds, verschiedene Entwickler?
JeffO

Durch die gemeinsame Nutzung der Datenbank wird die gesamte Datenbank zu einer großen und unübersichtlichen öffentlichen API. Und es fehlen alle Abstraktionen, die Sie möglicherweise in der ersten Anwendung erstellt haben.
Patrick

Ist Leistung ein Problem? Mit genügend Datensätzen, die einen von einer großen einzelnen Datenbank abhalten würden. Platz ist billig.
Rig

Antworten:


41

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.


Wenn ich einen Dienst für die gemeinsam genutzte Datenbank gemäß der Antwort von @ Saeed verwende, habe ich dann nicht immer noch das Problem, dass mehrere Apps nicht unterschiedliche Anforderungen haben und eine Vielzahl von Indizes in der Datenbank erfordern?
Laz

2
@ Laz: Hängt wahrscheinlich von den Anwendungsfällen und Anforderungen ab.
Falcon

2
Eine der Grundlagen des relationalen Datenbankdesigns besteht darin, keine Duplikatendaten zu haben. Verschiedene Datenbanken, in denen sich dieselben Daten überlappen, machen nur Ärger.
Pieter B

Pieter B: Ich nehme an, Sie haben noch nie in Unternehmensumgebungen wie bei großen Unternehmen gearbeitet. Eine Datenbank mit vielen verschiedenen Anwendungen und verschiedenen Entwicklungsteams zu haben, ist nur ein Problem und kann die Entwicklung zum Stillstand bringen. Das heißt, es gibt nie eine Schwarz-Weiß-Wahl imho.
Falcon

@PieterB: Das Lesen und Schreiben derselben Daten durch mehrere Anwendungen ist ein guter Hinweis darauf, dass Sie eine Service-Schicht herausrechnen sollten, gegen die alle Anwendungen Anforderungen stellen können. Wenn sie sich jedoch so unterscheiden, dass Sie einen gemeinsamen Dienst nicht ausschließen können, sind sie so unterschiedlich, dass separate Tabellen / Datenbanken erforderlich sind.
Dan Lyons

23

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.


3
+1 für eine logische Trennung und einen Vorschlag für eine saubere Architektur. SOA macht solche Dinge wirklich einfacher
Falcon

Auf jeden Fall +1 für die logische Organisation. Lassen Sie die Daten gruppieren, um das Gleichgewicht zwischen Kopplung und Zusammenhalt zu optimieren, und dann können Anwendungen in alle Datenbanken eintauchen, die sie für ihre Arbeit benötigen.
Joel Brown

9

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.


3

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.


+1: Es ist einfach genug, mehrere Anwendungen einer einzigen Datenbank zuzuordnen.
Kevin Cline

0

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.