Hintergrund
Ich schreibe viele große Berichte für eine große Datenbank mit Gesundheitsdaten (SPs, Funktionen, Jobs usw. schreiben) und verwalte diese im Allgemeinen. Das ursprüngliche Schema und die Software, die es verwendet, stammen von einem anderen Anbieter, sodass ich strukturell nicht viel daran ändern kann. Es gibt viele Aufzeichnungen, die nachverfolgt werden müssen, z. B. Labors, Verfahren, Impfstoffe usw., und sie sind über Dutzende von Tabellen verteilt, von denen viele aufgebläht und schlecht indiziert sind (ich konnte dies etwas korrigieren).
Das Problem
Das Problem ist, dass wir nur wenig Kontrolle über die Datenbank haben und dass es schwierig und langwierig ist, diese Berichte zu schreiben und zu pflegen, da sie von einem bestimmten Update oder Patch geändert werden können - insbesondere, wenn große Überschneidungen auftreten. Alles was es braucht ist ein Patch und ich stecke fest, große Teile eines Dutzends von Berichten neu zu schreiben. Darüber hinaus werden Abfragen schnell und langsam verschleiert, wenn Verknüpfungen, verschachtelte Auswahlen und das Anwenden von Stapeln ausgeführt werden.
Meine Lösung"
Mein Plan war es, alle diese Datensätze in eine "Catch-All" -Tabelle zu schreiben und Trigger auf die Originaltabellen zu schreiben, um die Datensätze in dieser Aggregattabelle zu verwalten. Natürlich müsste ich sicherstellen, dass meine Auslöser nach den Aktualisierungen intakt sind, aber dies wäre vom Standpunkt der Wartbarkeit viel einfacher und würde nur auf die Daten verweisen.
Die Tabelle wäre dünn und lang und würde nur die erforderlichen Daten speichern.
CREATE TABLE dbo.HCM_Event_Log (
id INT IDENTITY,
type_id INT NULL,
orig_id VARCHAR(36) NULL,
patient_id UNIQUEIDENTIFIER NOT NULL,
visit_id UNIQUEIDENTIFIER NULL,
lookup_id VARCHAR(50) NULL,
status VARCHAR(15) NULL,
ordered_datetime DATETIME NULL,
completed_datetime DATETIME NULL,
CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id)
)
Dann hätte ich verschiedene relationale Tabellen für Dinge wie type_id und item groupings.
Ich fange an, diese Idee zu überdenken, da einige dieser Tabellen zu einem großen Teil geschrieben sind. Die SPs und Berichte, die ich schreiben würde, würden auch auf die Daten verweisen. Ich befürchte, dass diese Tabelle mit so viel E / A zu einem Albtraum für das Sperren und Ausführen von Datensätzen wird.
Meine Frage
Ist eine schlechte oder eine gute Idee? Ich stelle fest, dass jede Situation in SQL Server (2008 r2 Standard Edition BTW) und der "manchmal" -Regel anders ist, aber ich suche wirklich nur nach allgemeinen Ratschlägen.
Ich habe angefangen, einen Service Broker in Betracht zu ziehen, aber ich führe nur einfache Aktualisierungen / Einfügungen durch ( siehe Alternative zur akzeptierten Antwort ). In vielen Fällen müssen die Daten in Echtzeit vorliegen, sodass die Verwendung einer Sicherungsdatenbank nicht wirklich funktioniert. Die Leistung ist für uns bereits ein Problem, aber das meiste davon hängt mit der Hardware zusammen, die in Kürze behoben wird.
quelle
Antworten:
Wenn ich dich richtig verstanden habe,
Ich würde es so angehen:
In diesem Fall können Sie die Struktur und die Indizes Ihrer Datenbank optimieren, um die Leistung Ihrer Berichte zu verbessern, ohne das System von Drittanbietern zu beeinträchtigen. Wenn sich die ursprüngliche Datenstruktur nicht dramatisch ändert, ändert sich die Logik Ihrer Abfragen für Ihre Berichte nicht, wenn sich die Datenbank von Drittanbietern ändert. Sie müssten nur den Synchronisierungsprozess anpassen.
Der Synchronisierungsprozess ist praktisch der Konvertierungsprozess - Sie konvertieren Daten aus der Datenbank eines Drittanbieters in die von Ihnen benötigte Struktur. Ein Teil dieses Konvertierungsprozesses könnte darin bestehen, etwaige Normalisierungsprobleme der ursprünglichen Datenbank eines Drittanbieters zu beheben. Nur dieser Teil des Systems muss die interne Struktur des Drittsystems kennen und von ihr abhängig sein. Ihre Hauptberichte und Hauptabfragen hängen nur von Ihrer Datenbank ab.
Der wichtigste Punkt ist also: Trennen und begrenzen Sie den Teil Ihres Systems, der von den Interna des Drittsystems abhängt.
aktualisieren
In Bezug auf Echtzeitanforderung. Übrigens dachte ich immer, dass die Definition von "Echtzeit" "garantierte Antwortzeit" ist, nicht "eine kleine Antwortzeit". Das hängt natürlich von Ihrer Anwendung ab. In meiner Praxis reicht es aus, wenn ich zwei Datenbanken innerhalb einer Minute nach der erkannten Änderung synchronisiere. Wenn ein Benutzer einen Bericht auf dem Bildschirm sieht und einige zugrunde liegende Daten geändert werden, muss der Bericht auf irgendeine Weise erneut ausgeführt werden, um diese Änderung widerzuspiegeln. Sie können nach Änderungen suchen oder ein Ereignis / eine Nachricht abhören. Die Berichtsabfrage muss jedoch erneut ausgeführt werden, um die neuesten Änderungen anzuzeigen.
Sie möchten bereits Trigger schreiben, um Änderungen in den Originaltabellen zu erfassen und diese Änderungen in eine generische Tabelle zu schreiben. Erfassen Sie Änderungen also wie beabsichtigt, aber schreiben Sie sie in ordnungsgemäß normalisierte Tabellen, nicht in eine einzelne.
Dies ist also ein Extremfall. Die Konvertierung der Datenstruktur von Drittanbietern in Ihre interne Datenstruktur erfolgt in den Triggern, die
INSERT/UPDATE/DELETE
für Tabellen von Drittanbietern ausgelöst werden. Es kann schwierig sein. Der Code der Auslöser hängt von der internen Struktur beider Systeme ab. Wenn die Konvertierung nicht trivial ist, kann sie das OriginalINSERT/UPDATE/DELETE
bis zu ihrem Fehlschlagen verzögern . Wenn Ihr Trigger einen Fehler enthält, kann dies die ursprüngliche Transaktion bis zu ihrem Fehlschlagen beeinträchtigen. Wenn sich das System eines Drittanbieters ändert, kann dies Ihren Auslöser beschädigen, was dazu führen würde, dass Transaktionen des Drittanbieters fehlschlagen.Weniger extremer Fall. Um den Code Ihrer Trigger einfacher und weniger fehleranfällig zu machen, schreiben Sie alle erfassten Änderungen in eine Staging- / Audit- / Diff-Tabelle, setzen Sie ein Flag und senden Sie eine Nachricht, dass Änderungen ausstehen, und starten Sie den Hauptkonvertierungsprozess durch diese Zwischentabellen und führen Sie die Konvertierung durch. Die Hauptsache hierbei ist, dass ein potenziell schwerer Konvertierungsprozess außerhalb des Umfangs der ursprünglichen Transaktion stattfinden sollte.
Auf den zweiten Blick ähnelt es Ihrem ursprünglichen Vorschlag in der Frage. Der Unterschied besteht jedoch darin, dass die Capture-All-Tabellen nur vorübergehend Daten enthalten. Die Datenmenge ist gering - genau das, was sich geändert hat. es muss kein einziger Tisch sein; Schließlich werden die Daten in separaten, ordnungsgemäß normalisierten, permanenten Tabellen gespeichert, über die Sie die volle Kontrolle haben, die unabhängig vom System eines Drittanbieters sind und die Sie für Ihre Abfragen optimieren können.
quelle
Stellen Sie es auf jeden Fall in einen standardisierten Satz von Tabellen, damit Sie die Importphase optimieren können, anstatt komplexe Berichte und Abfragen ändern zu müssen. Die Daten sollten dennoch normalisiert sein, was Mehrfachtabellen erfordert (aber mit guten Indizes).
Verwenden Sie, wie bereits erwähnt, keine Trigger, sondern synchronisieren Sie sie stapelweise.
Machen Sie sich keine Sorgen über viele Verknüpfungen. Wenn die Daten ordnungsgemäß normalisiert und indiziert werden, verursachen diese keine signifikanten Kosten oder Verwaltungslasten.
Die Zeit zum Denormalisieren in so etwas wie ein Data Warehouse ist, wenn Sie in der Lage sein müssen, viele verschiedene Arten von Abfragen für die Daten durchzuführen, die Sie nicht vorhersagen können. Es hat seine eigenen Nachteile und Gemeinkosten und sollte gegebenenfalls verwendet werden, nicht als Go-to-Sache.
quelle
Ich habe in der Vergangenheit in einem 24x7-Fertigungsunternehmen mit einer sehr ähnlichen Situation gearbeitet und mich schließlich für die Transaktionsreplikation entschieden. Es ist möglich , DDL so zu konfigurieren, dass es repliziert wird, sodass Sie alle Änderungen der Patches auf den Abonnenten übertragen können. Offensichtlich gibt es für alles Vor- und Nachteile, und Sie müssen sie abwägen, um festzustellen, was Sie gegen das, was für das Unternehmen am besten funktioniert, unterstützen können.
Positiv ist, dass:
Es gibt jedoch Nachteile:
quelle
Trigger haben so viele Probleme, dass Sie sie vermeiden sollten:
Eine bessere Option ist ein Job, der die Daten regelmäßig in eine neue Tabelle kopiert. Ihre Berichte können von der Kopie ausgeführt werden. Ein Job, der Zeilen kopiert, ist einfach zu schreiben und zu warten, und es besteht kein Risiko, dass er den Betrieb der Drittanbieteranwendung beeinträchtigt.
quelle
NOCOUNT
? 4. Es gäbe keine Auslöser auf der Zieltabelle, und ich könnte dasselbe für die anderen sicherstellen.