Entscheidungskriterien für die Verwendung eines Nicht-DBO-Schemas gegenüber einer neuen Datenbank


22

Ich bin größtenteils ein Anwendungsentwickler, muss aber die gesamte Vorab -Datenbankarbeit für mein aktuelles Projekt erledigen ( übrigens seinen MS SQL Server 2008 ). Als erste Entscheidung versuche ich herauszufinden, ob ich meinen Status mithilfe separater Datenbanken oder mithilfe separater Schemas in derselben Datenbank aufteilen soll. Ich habe ein wenig über SQL Server-Schemas gelesen und es scheint eine natürliche Möglichkeit zu sein, Objektdomänen ( die mir gefallen ) zu trennen , aber ich bin mir nicht sicher, ob dieses Muster versteckte Kosten verursachen kann.

Was sind die praktischeren Dinge, die ich bei der Auswahl zwischen diesen beiden Ansätzen berücksichtigen sollte? Wenn ich vermeiden , die dbo.mytablezu Gunsten der myschema.mytableich andere Herausforderungen (erschaffen oder Probleme ) für meine Architektur?

Als Randnotiz ... Irgendwann wird dies an einen echten Datenbankadministrator übergeben, um ihn zu unterhalten / zu unterstützen, also versuche ich sicherzustellen, dass ich ihnen das Leben nicht erschwere.


Ein Nebeneffekt der Verwendung eines anderen Schemas als dbo ist, dass Sie nicht vergessen, es zu schreiben. Dies ist ein Schritt in Richtung Wiederverwendung des Ausführungsplans.
Henrik Staun Poulsen

Antworten:


15

Zunächst möchte ich sagen, dass Schemas nicht als Namespaces oder Objektdomänen im Sinne von OO betrachtet werden. Schemata sind im Wesentlichen Berechtigungscontainer mit einem gewissen Mehrwert (siehe unten).

Auch "separate Schemata" oder "separate Datenbanken" sind zwei unterschiedliche Konzepte. Daten, die transaktionell und referenziell konsistent sein müssen, müssen sich in derselben Datenbank befinden. Siehe Eine Datenbank oder zehn? Blog-Artikel für mehr.

In dieser Datenbank können Sie Schemata zum Organisieren Ihrer Objekte verwenden oder auch nicht.

Persönlich bin ich ein Fan von Schemata und benutze sie immer, aber für Dinge wie Berechtigungen und logische Gruppierung. Dazu verweise ich Sie auf frühere Fragen, bei denen Sie sehen, dass die allgemeine Meinung für sie spricht:

Informationen zu separaten Datenbanken finden Sie in der Antwort von Aaron. Dies alles hängt jedoch von der Anforderung "Transaktions- und referenziell konsistent" ab.


9

Stimmen Sie mit @gbn überein. Ich habe Lösungen mit Schemata für die Trennung und Datenbanken für die Trennung entworfen und finde, dass die Verwendung von Datenbanken viel praktischer ist. Ein paar Gründe:

  1. Es ist viel einfacher, wenn Ihre App eine Verbindung zu einer kontextspezifischen Datenbank herstellt und dann dieselben Abfragen ausführt, als wenn Ihre Abfragen <schema>vor allen Objektreferenzen eingefügt werden. Dies bietet sich entweder für viele dynamische SQL-Vorgänge an, für viele verschiedene Anwendungsanmeldungen mit Standardschemata (dh Ihr Code würde kein Schemapräfix verwenden und sich auf das Standardschema des Anwendungsbenutzers stützen - dies kann zu einer massiven Auslastung des Plan-Cache und zu schwierigem Debugging führen). oder viele gespeicherte Prozeduren, die verwaltet werden müssen (stellen Sie sich nur einen einfachen Bericht vor, wenn Sie einen pro Schema benötigen, dann ändert sich der Code, jetzt müssen Sie den gleichen Code mehrmals ändern, einmal für jedes Schema).
  2. Durch die Trennung nach Datenbanken können Sie ausgelastete Datenbanken in schnellere oder andere Speicher / Instanzen verschieben, ohne Objekte aus einer großen, umfassenden Datenbank rippen zu müssen. Die meisten Leute denken nicht so weit im Voraus darüber nach, aber es ist definitiv ein potenzielles Skalenproblem. Insbesondere wenn Sie ein Schema haben, das "übernimmt" und die meisten Ressourcen auf dem Server benötigt, kann das Aufteilen eine äußerst mühsame Aufgabe sein, auch wenn diese bereits durch ein Schema getrennt sind.
  3. Durch separate Datenbanken können Sie auch unterschiedliche Wartungs- und Sicherungspläne für jede Abteilung festlegen. Ich bin mir nicht sicher, was Sie unter "Teilen nach Status" verstehen, aber wenn Sie davon ausgehen, dass Sie Kunden isolieren, haben Sie möglicherweise Kunden mit unterschiedlichen Anforderungen und unterschiedlicher Toleranz für Datenverlust, Indexpflege usw.
  4. Es kann vorkommen, dass Sie Kunden haben, die gesetzlich oder unternehmensrechtlich dazu verpflichtet sind, ihre Daten von anderen zu trennen. Dies ist normalerweise auf Datenbankebene akzeptabel, aber die Schemaebene wird normalerweise nicht ausreichen. Möglicherweise haben Sie diese Kunden jetzt nicht, aber es könnte später zu einem echten Problem werden, wenn Sie dies tun.

3
Die goldene Frage lautet nun "Sind alle Daten transaktionell und referenziell konsistent?" Ich
gehe

@gbn Das ist eine wirklich gute Frage und etwas, über das ich nachdenken muss, bevor ich mich auf einen Pfad begebe.
JoeGeeky

@AaronBertrand Das ist interessant ... Klingt so, als müsste ich ein wenig Kapazitätsplanung durchführen und sehen, wo Skalierungsprobleme auftreten können. Wenn eine horizontale Skalierung geeignet ist, können separate Datenbanken eine gute Wahl sein. Ansonsten muss ich andere Muster berücksichtigen.
JoeGeeky

2
@JoeGeeky: Unter dem Vorbehalt "Transaktions- und referenziell konsistent" kann eine einzelne Datenbank auch mit Dateigruppen skaliert werden. Wie auch immer, Sie haben 2 gültige Antworten, basierend auf Ihrem Anwendungsfall. Weder ist falsch.
22.01.12
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.