2010-09-02 13 views
7

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?

+0

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

Antwort

8

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.

+0

Wirklich wie der Link, danke! –

+0

Die Bücher sind ziemlich gut, obwohl alle Essays darin * open source * sind, also kannst du sie auf diesem Wiki kostenlos lesen –

4

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.

3

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.

1

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?

0

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.

1

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.

0

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.

+0

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. –

+0

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

0

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.

Verwandte Themen