Ich habe mich in letzter Zeit gefragt. Sagen wir, wir machen eine Webapp mit JSF + Spring + JPA/Hibernate (oder auch jede andere Technologie) und sagen wir haben eine Entität "User". Wir möchten, dass der Nutzer eine eindeutige Anmeldung erhält. Wenn wir es tun wollen, können wir ein @ UniqueConstraint in die "Login" -Spalte setzen, aber unsere Anwendung muss während der Benutzerregistrierung überprüfen, ob die Benutzereingabe gültig ist (einmalig) oder nicht, und nur mit der DB-Einschränkung wir werden einfach einen Fehler bekommen. Das hat mich zum Nachdenken gebracht, sind DB-Einschränkungen wirklich notwendig/hilfreich? Die einzigen beiden Male, an die ich denken kann, wenn sie uns irgendwelche Vorteile bringen würden, wären, wenn jemand versucht, uns zu hacken (aber ich denke, unsere App sollte sowieso SQL-injection-fähig sein) oder wir versuchen, den DB-Inhalt manuell zu ändern wirklich passieren). Jetzt, wo ich darüber nachdenke, sind DB-Zwänge überhaupt notwendig/gute Praxis? Wie die Länge eines Strings usw.Sind eindeutige Einschränkungen für die DB notwendig?
Antwort
Für mich kategorisch ja finden Database as a Fotress von Dan Chak von 97 denkt, dass jede Software Architect wissen sollte. Er sagt es viel besser als ich könnte.
Wirklich wie der Link, danke! –
Die Bücher sind ziemlich gut, obwohl alle Essays darin * open source * sind, also kannst du sie auf diesem Wiki kostenlos lesen –
Ja, das sind sie. Sie erzwingen Datenintegrität auf der niedrigsten Ebene.
Möglicherweise möchten Sie manuell DB Inhalt ändern (das heißt Upgrades auf neue Version)
Sie könnten vergessen, einige in Ihrem Code einschränken zu überprüfen.
Sie können dies wie Client/Server-Validierung betrachten. Ihr Programm ist Client, db ist Server. Meist ist die Client-Validierung ausreichend, aber Sie müssen eine Server-Validierung haben, nur für den Fall, dass etwas schief geht.
Ich denke, eine Datenperson würde sagen, beide sind absolut notwendig. Ihre Frage geht davon aus, dass Ihr Code für die mittlere Ebene jetzt und für immer vor dieser Datenbank angezeigt wird.
Die Wahrheit ist, dass mittlere Anwendungen kommen und gehen, aber Daten leben für immer.
Es ist kein Weg von der Länge der Spalten im Schemadesign entfernt. Ich denke, du fragst, ob es eine gute Übung für die mittlere Ebene ist, sie durchzusetzen. Vielleicht nicht, aber sie sind der Schlüssel für die Datenbank.
Wenn Sie eine Gruppe von Spalten als eindeutig deklarieren, sollten Sie sie abfragen. Daher sollte sie wahrscheinlich trotzdem indiziert werden.
Ja, Ihre Anwendung sollte die entsprechende Überprüfung durchführen, aber was passiert, wenn ein Fehler auftritt? Wenn Ihre Datenbank weiß, dass etwas eindeutig sein soll, wissen Sie zumindest, dass Sie keine ungültigen Daten speichern werden (oder nicht "schlecht" ungültige Daten, wie Duplikate von Daten, die eindeutig sein sollen). Auf jeden Fall könnte man die umgekehrte Frage stellen: Was kostet Sie das?
Sowohl eindeutige als auch fremde Einschränkungen erzwingen nicht nur die Datenintegrität, sondern haben auch Auswirkungen auf die Leistung. Ohne Kenntnis dieser "informellen" Konstanten werden Datenbankoptimierer unberechenbare Entscheidungen darüber treffen, wie Sie Ihre Anweisungen ausführen.
Wenn Sie fehlerhafte Daten haben möchten, entfernen Sie die eindeutigen Einschränkungen in der Datenbank. Ich arbeite seit den 1970er Jahren an Datenbanken und habe Daten in Hunderten von Datenbanken abgefragt oder importiert. Ich habe noch nie gute Daten in Datenbanken gesehen, in denen die Einschränkungen auf Anwendungsebene nicht richtig gesetzt sind. Viele andere Dinge als die Anwendung treffen die Datenbank (Importe von anderen Systemen, eine schnelle Aktualisierung von Prod-Daten, um ein Datenproblem zu beheben, das aus dem Abfragefenster ausgeführt wird, andere Anwendungen usw.). Häufig wird die Anwendung ersetzt und die Einschränkungen gehen verloren.
aber immer noch unsere Anwendung hat bei der Benutzerregistrierung zu prüfen, ob die Benutzereingabe gültig (unique) ist oder nicht, ohne dass und nur mit der Einschränkung DB wir einfach einen Fehler.
Das ist das Lustigste, was ich je gelesen habe. Sie erhalten einfach einen Fehler? Das ist wirklich alles was du brauchst, oder? Schon mal von Fehlerfallen gehört? Versuchen Catch Ring irgendwelche Glocken?
Es ist tatsächlich sehr kontraproduktiv für Ihre App zu "überprüfen". Die Datenbank wird sowieso auf die Beschränkung prüfen, warum also zweimal. Die App sollte nur die Zeile einfügen, als ob es in Ordnung wäre. Die Datenbank wird nach Eindeutigkeit suchen und einen Fehler bei einem Fehler auslösen ... Ihre App sollte diesen Fehler FANGEN und alles tun, was Sie in Ihrem bestehenden Scheck getan haben.
Nun, ich werde mehr darüber lesen müssen, da ich einen benutzerdefinierten JSF-Ausnahmehandler verwende, der umleitet ich auf eine page_not_found.jsf jedes Mal, wenn es eine Exception abfängt, und da ConstraintViolationException eine Unterklasse von Exception ist, wird es ebenfalls abgefangen und auf die Seite umgeleitet. Nicht ganz sicher, ob meine Nutzer damit zufrieden wären. –
Sich auf geworfene Fehler aus der Datenbank zu verlassen bedeutet normalerweise, dass Sie einen Fehler nach dem anderen bekommen, was zu einer schrecklichen Benutzererfahrung führt. Wenn Sie alle Ihre Probleme im Voraus überprüfen, können Sie sie den Benutzern auf einmal anzeigen. – Shlomo
Ja. Fangen Sie einfach den Schlüsselverletzungsfehler ab, und die Schlüsseleinschränkung hat die Arbeit für Sie erledigt, ohne zuerst einen zusätzlichen Aufwand für eine zusätzliche Prüfung auf sich nehmen zu müssen.
- 1. sql eindeutige und Einstellung Einschränkungen für Einsätze
- 2. Federdaten erzeugt unnötige eindeutige Einschränkungen
- 3. Warum sind Vorwärtsdeklarationen notwendig?
- 4. Eindeutige Einschränkungen für Member eines eingebetteten Members in Hibernate
- 5. App-Symbole für Launcher - die Zeichengrößen sind notwendig
- 6. Sind Schnittstellen in JavaScript notwendig?
- 7. Einschränkungen sind nicht perfekt für adaptives Layout
- 8. Coredata eindeutige Einschränkungen verschwindet in Xcode
- 9. Was sind die Einschränkungen für Methodennamen in Ruby?
- 10. Was sind die Einschränkungen für Lesezeichennamen in Microsoft Word?
- 11. Was sind bei MVC die Einschränkungen für den Controller?
- 12. auferlegen Einschränkungen für die Puffergröße
- 13. Wie zeige ich eindeutige Einschränkungen einer Tabelle in MySQL an?
- 14. Bedingte eindeutige Integritätsbedingung in Oracle DB
- 15. Sind dSYM-Dateien während der Entwicklung notwendig?
- 16. Sind Noreturn-Attribute bei bestehenden Funktionen notwendig?
- 17. Sind "Getter" und "Setter" in JavaScript notwendig?
- 18. Beste Datenstruktur für die folgenden Einschränkungen?
- 19. Ich muss eine eindeutige Einschränkungen entfernen, die ich nicht kenne die Namen
- 20. Einschränkungen für die SMTP-Nachrichten-ID?
- 21. Sind Bildpfade in einer Datenbank notwendig?
- 22. Was sind einige Muster für DB-Tabellenschemas?
- 23. welche Teile sind notwendig für eine benutzerdefinierte omniauth oauth2 Strategie für die Integration mit dem Diskurs
- 24. Warum sind Cygwin und MinGW notwendig?
- 25. Was sind Allokatoren und wann ist ihre Verwendung notwendig?
- 26. SQL-Tabelle Selbstreferenz Abfrage vs. eindeutige Einschränkungen Prüfsumme
- 27. Was sind NSubstitute Einschränkungen, speziell vs MOQ?
- 28. Ist die Verzeichnistrennkonstante notwendig?
- 29. Erstelle eine eindeutige ID für die URL
- 30. Einschränkungen für Shader
Glaubt jemand wirklich, dass es immer in Ordnung ist, einen Angriffsvektor weit offen zu lassen, unter der Annahme, dass ein Angriff durch einen bestimmten anderen Vektor kommen muss? Oder hat jemand das geschrieben, um provokativ zu sein und die Diskussion anzuregen? – bbadour