Was sind die häufigsten SQL-anti-patterns?
Alle von uns, die Arbeit mit relationalen Datenbanken gelernt haben (oder lernen), dass SQL ist anders. Entlocken die gewünschten Ergebnisse, und dabei so effizient, beinhaltet ein langwieriger Prozess, zum Teil geprägt durch lernen ungewohnten Paradigmen, und finden heraus, dass einige unserer vertrautesten Programmierung Muster, die nicht hier arbeiten. Was sind die häufigsten antipatterns, die Sie gesehen haben (oder selbst geschrieben)?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin durchweg enttäuscht von den meisten Programmierern die Tendenz zu mischen, Ihre UI-Logik im data access layer:
Normalerweise die Programmierer tun dies, weil Sie wollen binden Sie Ihren Datenbestand direkt auf einem raster, und es ist einfach bequem, um SQL Server-format server-Seite als format auf dem client.
Abfragen, wie oben dargestellt, sind extrem spröde, weil Sie fest paar die Daten-Schicht, um die UI-Schicht. Auf top von, dass, diese Art der Programmierung gründlich verhindert, dass gespeicherte Prozeduren von Mehrweg.
InformationsquelleAutor der Antwort
Hier sind meine top 3.
Nummer 1. Die Nichtangabe einer Feldliste. (Edit: um Verwechslungen vorzubeugen: dies ist eine Produktion von code-Regel. Es gilt nicht für one-off-analysis-Skripts - es sei denn, ich bin der Autor.)
sollte
Nummer 2. Mit einem cursor und die while-Schleife als eine while-Schleife mit einer Schleife Variablen zu tun.
Nummer 3. DateLogic durch string-Typen.
Sollte
Habe ich gesehen, den letzten spike "Eine Abfrage ist besser als zwei, amiright?"
Diese Abfrage erfordert zwei oder drei verschiedene Ausführungspläne abhängig von den Werten der Parameter. Nur ein Ausführungsplan generiert wird, und stecken in den cache für diesen sql-text. Dieser plan wird verwendet, unabhängig vom Wert der Parameter. Dies führt zeitweise schlechte Leistung. Es ist viel besser, zu schreiben, zwei Abfragen zu einer Abfrage pro soll Ausführungsplan).
InformationsquelleAutor der Antwort
Lesbare Passwort-Felderegad. Selbsterklärend.
Mit WIE vor indiziert
Spalten, und ich bin fast versucht zu
sagen Sie einfach, WIE im Allgemeinen.
Recycling-SQL-generierten PK-Werte.
Überrascht niemand erwähnt die
Gott-Tabelle noch. Nichts sagt
"Bio" wie 100 Spalten von bit
Fahnen, große strings und zahlen.
Dann gibt es "vermisse ich .ini
Dateien" Muster: speichern von CSVs, Rohr
getrennten Zeichenfolgen oder anderen analysieren
erforderlichen Daten in großen Textfeldern.
Und für MS SQL server die Verwendung von
Cursor an alle. Gibt es eine bessere
Weise zu tun, einer bestimmten cursor-Aufgabe.
Bearbeitet, weil es so viele!
InformationsquelleAutor der Antwort
Nicht tief zu Graben: Nicht mit prepared statements.
InformationsquelleAutor der Antwort
Verwendung bedeutungslos Tabelle Aliase:
Macht das Lesen eine große SQL-Anweisung so viel schwieriger, als es sein muss
InformationsquelleAutor der Antwort
InformationsquelleAutor der Antwort
Meine bugbears sind die 450 Spalte Access-Tabellen, die zusammen durch die 8-jährige Sohn der Geschäftsführer, die besten Freunde Hund, groomer und der zwielichtigen lookup-Tabelle, die nur existiert, weil jemand nicht weiß, wie man die Normalisierung einer datastructure richtig.
Normalerweise ist dieser lookup-Tabelle sieht wie folgt aus:
Habe ich verloren Zählung der Anzahl von clients, die ich gesehen habe, haben Systeme, die sich auf Abscheulichkeiten wie diese.
InformationsquelleAutor der Antwort
Diejenigen, die ich am meisten hasse sind
Mithilfe von Leerzeichen beim erstellen von Tabellen, sprocs etc. Ich bin fein mit CamelCase oder under_scores und singular-oder Pluralformen und groß-oder Kleinbuchstaben, aber mit verweisen auf eine Tabelle oder Spalte [mit Leerzeichen], besonders wenn es [ es ist seltsam spaced] (ja, ich habe in diesem) wirklich reizt mich.
Denormalisierte Daten. Eine Tabelle muss nicht perfekt normalisiert, aber wenn ich in eine Tabelle der Mitarbeiter, die Informationen über Ihre aktuelle Bewertung-score oder Ihre primären nichts, es sagt mir, dass ich wahrscheinlich benötigen, um eine separate Tabelle zu einem bestimmten Punkt und dann versuchen, Sie zu halten synchronisiert. Ich werde normalisieren Sie die Daten zuerst, und dann, wenn ich einen Platz sehen, wo Denormalisierung hilft, ich werde es prüfen.
Überbeanspruchung der Blick auf oder Cursor. Blick auf einen Zweck haben, aber wenn jeder Tisch ist verpackt in einer Sicht es ist zu viel. Ich habe zu verwenden von Cursorn, ein paar mal, aber im Allgemeinen Sie können andere Mechanismen für diese.
Zugang. Kann ein Programm sein, ein anti-pattern? Wir haben SQL-Server in meiner Arbeit, aber eine Anzahl von Menschen den Zugang aufgrund seiner Verfügbarkeit, "ease of use" und "Freundlichkeit" für nicht-technische Anwender. Es ist zu viel hier zu gehen, aber wenn Sie schon in einer ähnlichen Umgebung, die Sie kennen.
InformationsquelleAutor der Antwort
verwenden Sie SP als Präfix der gespeicherten Prozedur Namen, weil Sie zuerst suchen, in das System Verfahren eher den Ort als die eigene diejenigen.
InformationsquelleAutor der Antwort
Übermäßigen Gebrauch von temporären Tabellen und Cursor.
InformationsquelleAutor der Antwort
Für die Speicherung von Zeit-Werten, nur die UTC-Zeitzone verwendet werden soll. Lokale Zeit sollte nicht verwendet werden.
InformationsquelleAutor der Antwort
mithilfe von @@IDENTITY statt SCOPE_IDENTITY()
Zitiert aus diese Antwort :
InformationsquelleAutor der Antwort
Neu-mit einem 'Toten' Bereich für etwas, das es gar nicht dafür gedacht sind (z.B. Speicherung von Benutzerdaten in einer 'Fax' - Feld) - sehr verlockend als schnellen fix aber!
InformationsquelleAutor der Antwort
davon aus, dass das Ergebnis sortiert werden, indem some_column. Ich habe gesehen, dass dies etwas mit Sybase, wo die Annahme hält (für jetzt).
InformationsquelleAutor der Antwort
Oder, stopft alles in eine Zeile.
InformationsquelleAutor der Antwort
Den
FROM TableA, TableB WHERE
syntax für JOINS anstattFROM TableA INNER JOIN TableB ON
Annahmen, die von einer Abfrage zurückgegeben werden, sortiert eine bestimmte Art und Weise, ohne dass man eine ORDER BY-Klausel, nur weil das war die Art und Weise es zeigte sich während der Tests in der Abfrage-tool.
InformationsquelleAutor der Antwort
Muss ich meine eigenen aktuellen Lieblings hier, nur um die Liste vollständig ist. Meine Lieblings-antipattern ist nicht testen Sie Ihre Abfragen.
Dies gilt, wenn:
Und alle tests, die gegen atypische oder Unzureichende Daten zählen nicht. Wenn es eine gespeicherte Prozedur, setzen Sie die test-Anweisung in einen Kommentar, und speichern Sie es, mit den Ergebnissen. Andernfalls setzen Sie es in einen Kommentar im code mit den Ergebnissen.
InformationsquelleAutor der Antwort
Lernen SQL, die in den ersten sechs Monaten Ihrer Karriere, und nie lernen etwas anderes für die nächsten 10 Jahre. Insbesondere nicht lernen oder effektiv mit windowing/analytische SQL-Funktionen. Insbesondere die Verwendung von over() und die partition durch.
Sehen O ' Reilly SQL Cookbook Anhang A für ein schöner überblick über die windowing-Funktionen.
InformationsquelleAutor der Antwort
Temporäre Tabelle Missbrauch.
Speziell diese Art der Sache:
Nicht bauen eine temporäre Tabelle, aus einer Abfrage, nur zum löschen der Zeilen die Sie nicht brauchen.
Und ja, ich habe gesehen Seiten code in dieser form in der Produktion DBs.
InformationsquelleAutor der Antwort
Konträre Ansicht: über-obsession mit der Normalisierung.
Meisten SQL/RBDBs Systeme bieten eine Vielzahl von Funktionen (Transaktionen, Replikation) , sind sehr nützlich, auch mit nicht normalisierte Daten. Speicherplatz ist Billig, und manchmal kann es einfacher (einfacher code, schnellere Entwicklungszeit) zu manipulieren /filter /Suche abgerufenen Daten, als es ist, schreiben, bis 1NF-schema, und befassen sich mit all den ärger enthaltenen (komplexen Verknüpfungen, versaute subselects, etc).
Habe ich festgestellt, die über-normierte Systeme sind Häufig vorzeitige Optimierung, insbesondere während der frühen Entwicklungsstadien.
(weitere Gedanken über Sie... http://writeonly.wordpress.com/2008/12/05/simple-object-db-using-json-and-python-sqlite/)
InformationsquelleAutor der Antwort
Ich habe nur diese eine zusammen, basierend auf einige der SQL-Antworten Sie hier auf ALSO.
Es ist eine ernste antipattern zu denken, dass auslöst, sind Datenbanken, die als event-Handler werden zu OOP. Es gibt diese Wahrnehmung, dass nur eine alte Logik in Triggern zu werden abgefeuert, wenn eine Transaktions - (Ereignis) passiert, auf einem Tisch.
Nicht wahr. Einer der großen Unterschiede sind, dass Trigger synchron sind - mit einer Rache, weil Sie synchron über einen set-Vorgang, der nicht auf eine Zeile Betrieb. Auf der OOP Seite, genau das Gegenteil - events sind eine effiziente Möglichkeit zu implementieren asynchrone Transaktionen.
InformationsquelleAutor der Antwort
1) ich weiß nicht, es ist eine "offizielle" anti-pattern, aber ich mag nicht und versuchen zu vermeiden, string-Literale, wie Magie Werte in einer Spalte in der Datenbank.
Ein Beispiel aus dem MediaWiki-Tabelle "Bild":
(Ich habe nur bemerkt, verschiedene Gehäuse, eine andere Sache zu vermeiden)
Entwerfe ich solche Fälle als int-lookups in den Tabellen ImageMediaType und ImageMajorMime mit int primary keys.
2) Tag/string-Umwandlung, stützt sich auf bestimmte NLS-Einstellungen
ohne format identifier
InformationsquelleAutor der Antwort
Identisch sind Unterabfragen in einer Abfrage.
InformationsquelleAutor der Antwort
Veränderter Blick - Ein Blick verändert sich zu oft und ohne Vorherige Ankündigung oder Grund. Die änderung wird entweder bemerkte am meisten unpassenden Zeit oder noch schlimmer falsch sein und nie bemerkt. Vielleicht Ihrer Anwendung unterbrochen wird, weil jemand dachte, einen besseren Namen für diese Spalte. Als eine Regel sollte Ansichten erweitern die Nützlichkeit des Basis-Tabellen unter Beibehaltung eines Vertrages mit Verbrauchern. Probleme lösen, aber nicht durch hinzufügen von features oder schlimmer Verhalten zu ändern, für das erstellen einer neuen Ansicht. Zu mildern, nicht teilen Sie Ansichten mit anderen Projekten und verwenden Sie CTEs wenn Plattformen ermöglichen. Wenn Ihr Geschäft hat ein DBA kann man wohl nicht ändern Ansichten, aber alle Ihre Ansichten veraltet und oder nutzlos in diesem Fall.
Den !Paramed - Können in einer Abfrage mehr als einen Zweck? Wohl aber die nächste person, die liest es nicht wissen, bis Sie die Tiefe meditation. Auch wenn Sie diese nicht brauchen gerade jetzt sind die Chancen Sie haben, auch wenn es "nur" zum Debuggen. Hinzufügen von Parametern verringert Wartung Zeit und halten die Dinge TROCKEN. Wenn Sie eine where-Klausel verfügen, sollten Sie die Parameter haben.
Fall für keinen FALL -
InformationsquelleAutor der Antwort
Gespeicherte Prozeduren oder Funktionen, ohne Kommentare...
InformationsquelleAutor der Antwort
Setzen Sachen in temporäre Tabellen, vor allem Menschen, die Schalter von SQL Server zu Oracle haben die Angewohnheit, übernutzung temporäre Tabellen. Nur mit geschachtelten select-Anweisungen.
InformationsquelleAutor der Antwort
Den beiden finde ich die meisten, und kann erhebliche Kosten in Bezug auf die Leistung sind:
Hilfe des cursors anstelle einer Gruppe basiert
Ausdruck. Ich denke, das man Häufig Auftritt, wenn der Programmierer denkt procedurely.
Mithilfe korrelierter Unterabfragen, wenn ein
"join", um eine abgeleitete Tabelle, die tun können, die
job.
InformationsquelleAutor der Antwort
Entwickler schreiben von Abfragen, die zimmerreserviereung, ohne das eine gute Idee, was macht SQL-Anwendungen (individuelle Abfragen und multi-user-Systeme) schnell oder langsam. Dies beinhaltet die Unwissenheit über:
InformationsquelleAutor der Antwort
Verwendung von SQL als verherrlicht ISAM (Indexed Sequential Access Method) - Paket. Insbesondere die nesting-Cursor anstelle der Kombination von SQL-Anweisungen in einem einzelnen, wenn auch größeren, Anweisung. Dies gilt auch als 'Missbrauch der Optimierer", denn in der Tat gibt es nicht viel der optimizer tun können. Dies kann kombiniert werden mit nicht-prepared statements für maximale Ineffizienz:
Die richtige Lösung (fast immer) kombinieren Sie die beiden SELECT-Anweisungen in einem:
Nur den Vorteil der doppelten loop-version ist, dass Sie können leicht erkennen, die Pausen zwischen den Werten in Tabelle1, weil die innere Schleife endet. Dies kann ein Faktor sein, der die Kontrolle-Pause berichten.
Auch die Sortierung in der Anwendung ist in der Regel ein no-no.
InformationsquelleAutor der Antwort
Mit Primärschlüssel als ein Surrogat für die Aufnahme von Adressen und die Verwendung von Fremdschlüsseln als Surrogat für Zeiger eingebettet in den Aufzeichnungen.
InformationsquelleAutor der Antwort