Wenn ich Datenbankmodelle für RDBMS überprüfe, bin ich normalerweise überrascht, keine oder nur geringe Einschränkungen zu finden (abgesehen von PK / FK). Beispielsweise wird der Prozentsatz häufig in einer Spalte des Typs gespeichert int
(wobei tinyint
dies angemessener wäre), und es gibt keine CHECK
Einschränkung, den Wert auf den Bereich 0..100 zu beschränken. In ähnlicher Weise erhalten Antworten auf SE.SE, die Check-Einschränkungen vorschlagen, häufig Kommentare , die darauf hinweisen, dass die Datenbank der falsche Ort für Einschränkungen ist.
Wenn ich nach der Entscheidung frage, keine Einschränkungen zu implementieren, antworten die Teammitglieder:
Entweder, dass sie nicht einmal wissen, dass solche Funktionen in ihrer Lieblingsdatenbank vorhanden sind. Dies ist nur für Programmierer verständlich, die ORMs verwenden, weniger für Datenbankadministratoren, die angeben, über 5 Jahre Erfahrung mit einem bestimmten RDBMS zu haben.
Oder dass sie solche Einschränkungen auf Anwendungsebene durchsetzen und diese Regeln in der Datenbank duplizieren, ist keine gute Idee, da sie gegen SSOT verstoßen.
In letzter Zeit sehe ich immer mehr Projekte, in denen nicht einmal Fremdschlüssel verwendet werden. In ähnlicher Weise habe ich hier einige Kommentare zu SE.SE gesehen, die zeigen, dass den Benutzern die referenzielle Integrität nicht sehr wichtig ist und die Anwendung damit umgehen kann.
Bei der Frage nach der Entscheidung, FKs nicht zu verwenden, sagen die Teams Folgendes:
Es ist PITA, zum Beispiel, wenn man ein Element entfernen muss, auf das in anderen Tabellen verwiesen wird.
NoSQL rockt und es gibt dort keine Fremdschlüssel. Daher brauchen wir sie in RDBMS nicht.
In Bezug auf die Leistung ist dies keine große Sache (der Kontext sind normalerweise kleine Intranet-Webanwendungen, die mit kleinen Datenmengen arbeiten, sodass selbst Indizes keine allzu große Rolle spielen; es ist für niemanden wichtig, wenn die Leistung einer bestimmten Abfrage 1,5 Sekunden überschreitet bis 20 ms.)
Wenn ich mir die Anwendung selbst ansehe, stelle ich systematisch zwei Muster fest:
Die Anwendung bereinigt Daten ordnungsgemäß und überprüft sie, bevor sie an die Datenbank gesendet werden. Beispielsweise gibt es keine Möglichkeit, einen Wert
102
als Prozentsatz in der Anwendung zu speichern .Die Anwendung geht davon aus, dass alle Daten, die aus der Datenbank stammen, vollständig gültig sind. Das heißt, wenn es
102
als Prozentsatz kommt, stürzt entweder irgendwo etwas ab oder es wird dem Benutzer einfach so angezeigt, wie es ist, was zu seltsamen Situationen führt.Während mehr als 99% der Abfragen von einer einzelnen Anwendung ausgeführt werden, werden im Laufe der Zeit Skripts angezeigt - entweder Skripts, die bei Bedarf manuell ausgeführt werden, oder Cron-Jobs. Einige Datenvorgänge werden auch manuell in der Datenbank selbst ausgeführt. Sowohl Skripte als auch manuelle SQL-Abfragen bergen ein hohes Risiko, ungültige Werte einzuführen.
Und hier kommt meine Frage:
Was sind die Gründe, relationale Datenbanken ohne Prüfungseinschränkungen und eventuell sogar ohne Fremdschlüssel zu modellieren?
Aufgrund dieser Frage und der erhaltenen Antworten (insbesondere der interessanten Diskussion mit Thomas Kilian) habe ich einen Artikel mit meinen Schlussfolgerungen zum Thema Datenbankbeschränkungen verfasst .