18 Stimmen

Ist ein "Schwarzer-Loch-Tisch" böse?

Lesen zu diese Frage Ich habe gerade erfahren, dass es die blackhole Tabellentrick: besteht im Wesentlichen darin, eine einzige Tabelle zum Einfügen von Daten zu verwenden, und dann einen Trigger, der die Daten in viele andere Tabellen aufteilt.

Ich frage mich, ob dies zu Problemen führen könnte, sobald die Entwickler, die an dem Projekt arbeiten, sich dessen bewusst sind.

Was sind die Vor- und Nachteile dieser technik ?

bearbeiten : Der Blink, den ich im Kopf hatte, als ich das Beispiel sah, bezieht sich auf Transaktionen: Wenn aus irgendeinem Grund die Transaktion fehlschlägt, finden Sie die blackhole Zeile mit den Originaldaten, für historische Zwecke und vielleicht eine Hilfe bei der Fehlersuche - aber das scheint die einzige +1 zu sein, die ich bei schwarzen Löchern sehen kann. Ideen?

18voto

Neville Kuyt Punkte 28114

Ich glaube nicht, dass Blackhole echte Vorteile hat.

Das Schreiben des Auslösercodes zum Verschieben von Daten ist wahrscheinlich nicht wesentlich weniger aufwändig als das Schreiben des Codes zum Einfügen der Daten an der richtigen Stelle.

Wie Christian Oudard schreibt, wird dadurch die Komplexität nicht verringert, sondern nur an einen Ort verlagert, an dem es sehr schwer ist, Fehler zu beheben.

Die Kehrseite der Medaille:

"Nebeneffekte" sind in der Regel eine schlechte Idee bei der Softwareentwicklung. Auslöser sind Nebeneffekte - ich beabsichtige, eine Sache zu tun (Daten in eine Tabelle einzufügen), und tatsächlich werden viele andere Dinge getan. Wenn ich nun meinen Code debugge, muss ich auch alle Nebeneffekte im Kopf behalten - und die Nebeneffekte könnten selbst Nebeneffekte haben.

Die meiste Software verbringt weit mehr Zeit mit der Wartung als mit der Entwicklung. Wenn man neue Entwickler in das Team holt und ihnen den Trick mit dem schwarzen Loch erklärt, wird sich die Lernkurve wahrscheinlich erhöhen - mit vernachlässigbarem Nutzen (meiner Meinung nach).

Da es sich bei Triggern um Seiteneffekte handelt und es relativ einfach ist, eine riesige Kaskade von Triggern auszulösen, wenn man nicht aufpasst, habe ich immer versucht, meine Datenbanken ohne Trigger zu entwerfen; wo Trigger eindeutig der richtige Weg sind, habe ich sie nur meine erfahrensten Entwickler erstellen lassen. Der Trick mit dem schwarzen Loch macht Trigger zu einer normalen, regelmäßigen Arbeitsweise. Dies ist natürlich ein persönlicher Standpunkt.

16voto

pilcrow Punkte 53851

Les ursprüngliche Frage die Sie veranlasst haben, geht nicht auf den Kern der "schwarzen Löcher" von MySQL ein.

Was ist eine BLACKHOLE?

In MySQL-Sprache, BLACKHOLE ist eine Speicher-Engine die einfach alle Daten verwirft, die in sie eingefügt werden, analog zu einem Null-Gerät. Es gibt eine Reihe von Gründen, dieses Backend zu verwenden, aber sie sind etwas abstrus:

  • Ein "Nur-Relais"-Slave mit Bin-Log-Filterung
    Siehe die docs y aquí y aquí .
  • Benchmarking
    Z.B. Messung des Overheads der Binärprotokollierung, ohne sich um den Overhead des Speichersystems zu kümmern
  • Verschiedene rechnerische Tricks
    Véase aquí .

Wenn Sie nicht wissen, warum Sie eine als Tabelle getarnte Datensenke benötigen, sollten Sie sie nicht verwenden.

Welche Technik ist das, nach der Sie fragen?

Les fragliche Nutzung zu sein scheint:

  1. INSERTed-Daten in andere Tabellen umzuleiten
  2. Audit-Protokoll der ursprünglichen INSERTion-Aktion
  3. verwirft die ursprünglichen INSERT-Daten

Die Antwort auf die Frage nach der "Bösartigkeit" oder den Vor- und Nachteilen ist also dieselbe wie die Antwort auf diese Fragen für einfügbare/aktualisierbare VIEWs (die übliche Art, Nr. 1 zu implementieren), auslöserbasierte Audit-Protokollierung (wie die meisten Leute Nr. 2 durchführen) und Verhaltensüberschreibungen/Gegenmaßnahmen im Allgemeinen (es gibt eine Reihe von Möglichkeiten, Nr. 3 zu erreichen).

Wie lautet also die Antwort?

Die Antwort lautet natürlich: "Manchmal sind diese Techniken angemessen, manchmal nicht." :) Wissen Sie, warum Sie das tun? Ist die Anwendung ein besserer Ort für diese Funktionalität? Ist die Abstraktion zu spröde, zu undicht, zu starr, usw.?

4voto

Bryan Punkte 417

Das sieht nicht nach einer guten Idee aus. Wenn Sie versuchen, den Front-End-Code einfach zu halten, warum nicht einfach eine gespeicherte Prozedur verwenden? Wenn es nicht darum geht, den Front-End-Code einfach zu halten, verstehe ich den Sinn überhaupt nicht.

3voto

Tom Mac Punkte 9525

Lustigerweise habe ich heute auch von der Existenz von Schwarzen Löchern erfahren.

Die Frage, die sich hier stellt, ist eigentlich eine allgemeinere Frage, nämlich ob Geschäftslogik in Datenbank-Trigger eingebettet werden sollte oder nicht. In diesem Fall wird die Blackhole-Tabelle im Wesentlichen als vorübergehender Datenspeicher verwendet, auf den der Trigger für die Blackhole-Tabelle zurückgreifen kann. Sollte der Trigger überhaupt verwendet werden? Für mich ist das der eigentliche Kern der Frage.

Ich persönlich bin der Meinung, dass die Verwendung von Triggern nur auf die Protokollierung und DBA-spezifische Aufgaben beschränkt sein sollte und keine Geschäftslogik (oder überhaupt eine Logik) enthalten sollte, die fest in die Anwendungsschicht gehört. Es hat den Anschein, als gäbe es eine ganze Reihe von Meinungen darüber, ob Datenbank-Trigger sind böse oder nicht . Ich denke, Ihre Frage fällt auch in diese Kategorie.

Die Einbettung von Logik der Anwendungsschicht in Datenbank-Trigger kann riskant sein.

Es wird wahrscheinlich dazu führen, dass die Geschäftslogik zwischen den Anwendungen aufgeteilt wird. Code und der Datenbank aufzuteilen. Dies kann sehr verwirrend sein für jemanden, der versucht, eine Codebasis zu unterstützen und zu verstehen.

Wenn Sie zu viel Logik in Triggern und gespeicherten Prozeduren haben, kann es leicht zu Leistungsproblemen auf Ihrem Datenbankserver kommen, die durch die Verteilung der schweren Verarbeitungsaufgaben, d.h. der komplexen Geschäftslogik, auf die Anwendungsserver hätten behoben werden können und den Datenbankserver für seinen Hauptzweck, d.h. die Bereitstellung von Daten, frei lassen sollten.

Das ist natürlich nur meine Meinung!

2voto

MatthewMartin Punkte 31018

Jedes Mal, wenn Sie eine Zeile in eine Tabelle einfügen, stehen die Chancen gut, dass Sie in denselben Bereich der Festplatte oder dieselbe Seite schreiben (in der MS-SQL-Welt, bei Postgresql weiß ich es nicht), so dass diese Technik wahrscheinlich zu Konflikten und Sperren führt, da alle Transaktionen nun darum konkurrieren, in dieselbe Tabelle zu schreiben.

Außerdem wird dadurch die Leistung der Einsätze halbiert, da zwei Einsätze statt einem benötigt werden.

Dies ist eine Denormalisierung, da nun zwei Kopien der Daten anstelle von einer vorhanden sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X