Warum sind Positionsabfragen schlecht?

7

Ich lese CJ Date's SQL und Relationale Theorie: Wie man genauen SQL Code schreibt , und er macht den Fall, dass Positionsabfragen schlecht sind - zum Beispiel dieses INSERT :

%Vor%

Stattdessen sollten Sie attributbasierte Abfragen wie folgt verwenden:

%Vor%

Nun verstehe ich, dass die erste Abfrage nicht mit dem relationalen Modell übereinstimmt, da Tupel (Zeilen) ungeordnete Gruppen von Attributen (Spalten) sind. Ich habe Probleme zu verstehen, wo der Schaden in der ersten Abfrage ist. Kann mir das jemand erklären?

    
Jason Baker 04.07.2009, 20:57
quelle

9 Antworten

20
___ qstnhdr ___ Warum sind Positionsabfragen schlecht? ___ qstntxt ___

Ich lese CJ Date's SQL und Relationale Theorie: Wie man genauen SQL Code schreibt , und er macht den Fall, dass Positionsabfragen schlecht sind - zum Beispiel dieses SELECT * :

%Vor%

Stattdessen sollten Sie attributbasierte Abfragen wie folgt verwenden:

%Vor%

Nun verstehe ich, dass die erste Abfrage nicht mit dem relationalen Modell übereinstimmt, da Tupel (Zeilen) ungeordnete Gruppen von Attributen (Spalten) sind. Ich habe Probleme zu verstehen, wo der Schaden in der ersten Abfrage ist. Kann mir das jemand erklären?

    
___ answer1082990 ___

Sie sollten versuchen, Ihre SQL-Abfragen so wenig wie möglich vom genauen Layout der Tabelle abhängig zu machen.

Die erste Abfrage beruht darauf, dass die Tabelle nur drei Felder in genau dieser Reihenfolge enthält. Jede Änderung an der Tabelle wird die Abfrage unterbrechen.

Die zweite Abfrage beruht nur darauf, dass es diese drei Felder in der Tabelle gibt, und die Reihenfolge der Felder ist irrelevant. Sie können die Reihenfolge der Felder in der Tabelle ändern, ohne die Abfrage zu unterbrechen, und Sie können sogar Felder hinzufügen, solange sie Nullwerte zulassen oder einen Standardwert haben.

Obwohl Sie das Tabellenlayout nicht sehr oft neu anordnen, ist das Hinzufügen weiterer Felder zu einer Tabelle durchaus üblich.

Auch die zweite Abfrage ist besser lesbar. Sie können aus der Abfrage selbst erkennen, was die Werte in den Datensatz bedeuten.

    
___ answer 1082959 ___

Mir sind theoretische Konzepte in dieser Hinsicht nicht wirklich wichtig (wie in der Praxis hat eine Tabelle eine definierte Spaltenreihenfolge). Der Hauptgrund, warum ich die zweite der ersten bevorzugen würde, ist eine zusätzliche Abstraktionsebene . Sie können Spalten in einer Tabelle ändern, ohne Ihre Abfragen zu verwirren.

    
___ answer 1082958 ___

Die erste Abfrage bricht jedes Mal, wenn sich das Tabellenschema ändert. Die zweite Abfrage berücksichtigt jede Schemaänderung, die ihre Spalten intakt lässt und keine standardmäßigen Spalten hinzufügt.

Personen, die %code% Abfragen durchführen und sich dann auf die Positionsnotation verlassen, um die Werte zu extrahieren, um die sie besorgt sind, sind Softwarewartungs-Superschurken     

___ answer1083004 ___

SQL gibt Ihnen die Syntax zum Angeben des Spaltennamens für INSERT- und SELECT-Anweisungen. Sie sollten dies verwenden, weil:

  • Ihre Abfragen sind stabil gegenüber Änderungen in der Spaltenreihenfolge, sodass die Wartung weniger Zeit in Anspruch nimmt.
  • Die Reihenfolge der Spalten ist besser auf die Art und Weise abgestimmt, wie die Leute denken, sodass sie besser lesbar ist. Es ist klarer, sich eine Spalte als die "Name" -Spalte und nicht als die zweite Spalte vorzustellen.
___ answer1083076 ___

Etwas, das noch nicht erwähnt wurde, ist, dass Sie oft einen Ersatzschlüssel als PK haben, mit %code% (oder etwas Ähnlichem), um einen Wert zuzuweisen. Bei der ersten Methode müssten Sie etwas angeben. Aber welchen Wert können Sie angeben, wenn er nicht verwendet werden soll? %code% könnte eine Option sein, aber das passt nicht wirklich, wenn man bedenkt, dass der PK auf %code% gesetzt wäre.

Aber abgesehen davon ist das Ganze "an ein bestimmtes Schema gebunden" ein viel wichtigerer Grund, IMO.

    
___ answer1083066 ___

Ich bevorzuge die UPDATE-ähnliche Syntax:

%Vor%

Das ist viel einfacher zu lesen und zu pflegen als beide Beispiele.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ answer4510708 ___

Ich werde eine weitere Sache hinzufügen, die zweite Abfrage ist weniger anfällig für Fehler, sogar bevor Tabellen geändert werden. Warum sage ich das? Aufgrund des Seocnd-Formulars können Sie (und sollten beim Schreiben der Abfrage) visuell prüfen, ob die Spalten in der Einfügetabelle und die Daten in der Klausel values ​​oder select tatsächlich in der richtigen Reihenfolge liegen. Andernfalls könnte es passieren, dass Sie die Sozialversicherungsnummer aus Versehen in das Honorarfeld eingeben und den Sprechern ihre SSN zahlen anstatt den Betrag, den sie für eine Rede leisten sollten (Beispiel nicht willkürlich gewählt, außer dass wir es vorher eingefangen haben) Sichtprüfung!).

    
___ answer1083074 ___

Langfristig, wenn Sie Ihrer Tabelle eine weitere Spalte hinzufügen, funktioniert Ihr INSERT nur, wenn Sie die Spaltenliste explizit angeben. Wenn jemand die Reihenfolge der Spalten ändert, kann Ihr INSERT im Hintergrund erfolgreich Werte in falsche Spalten einfügen.

    
___ tag123tuples ___ Bei der Programmierung sind Tupel einfache * Produkttypen *, die geordnete Sammlungen von Typen darstellen. ___ tag123relationalmodel ___ Für Fragen zur Verwendung des relationalen Modells für Datenbanken. ___ tag123datellierrelations ___ Eine Relation ist eine Datenstruktur, die aus einer Überschrift und einer ungeordneten Menge von Tupeln besteht, die denselben Typ haben. ___ tag123relationalalgebra ___ Relationale Algebra ist ein Abkömmling der Logik erster Ordnung und der Algebra von Mengen, die sich mit Relationen (Mengen von Tupeln) befassen. In der Informatik wird relationale Algebra häufig im Umgang mit Datenbanken verwendet. Operatoren in der relationalen Algebra verwenden Relationen als Operanden und erzeugen als Ergebnis eine Relation. ___ answer1082961 ___

Obwohl die Reihenfolge der Spalten im Schema definiert ist, sollte sie im Allgemeinen nicht als wichtig angesehen werden, da sie nicht konzeptionell wichtig ist.

Es bedeutet auch, dass jeder, der die erste Version liest, das Schema konsultieren muss, um herauszufinden, was die Werte bedeuten sollen. Zugegeben, das ist so, als würde man in den meisten Programmiersprachen Positionsargumente verwenden, aber irgendwie fühlt sich SQL in dieser Hinsicht etwas anders - ich würde die zweite Version sicherlich leichter verstehen (vorausgesetzt, die Spaltennamen sind vernünftig).

    
___
chaos 04.07.2009, 21:01
quelle
9

Obwohl die Reihenfolge der Spalten im Schema definiert ist, sollte sie im Allgemeinen nicht als wichtig angesehen werden, da sie nicht konzeptionell wichtig ist.

Es bedeutet auch, dass jeder, der die erste Version liest, das Schema konsultieren muss, um herauszufinden, was die Werte bedeuten sollen. Zugegeben, das ist so, als würde man in den meisten Programmiersprachen Positionsargumente verwenden, aber irgendwie fühlt sich SQL in dieser Hinsicht etwas anders - ich würde die zweite Version sicherlich leichter verstehen (vorausgesetzt, die Spaltennamen sind vernünftig).

    
Jon Skeet 04.07.2009 21:03
quelle
5
___ qstnhdr ___ Warum sind Positionsabfragen schlecht? ___ qstntxt ___

Ich lese CJ Date's SQL und Relationale Theorie: Wie man genauen SQL Code schreibt , und er macht den Fall, dass Positionsabfragen schlecht sind - zum Beispiel dieses %code% :

%Vor%

Stattdessen sollten Sie attributbasierte Abfragen wie folgt verwenden:

%Vor%

Nun verstehe ich, dass die erste Abfrage nicht mit dem relationalen Modell übereinstimmt, da Tupel (Zeilen) ungeordnete Gruppen von Attributen (Spalten) sind. Ich habe Probleme zu verstehen, wo der Schaden in der ersten Abfrage ist. Kann mir das jemand erklären?

    
___ answer1082990 ___

Sie sollten versuchen, Ihre SQL-Abfragen so wenig wie möglich vom genauen Layout der Tabelle abhängig zu machen.

Die erste Abfrage beruht darauf, dass die Tabelle nur drei Felder in genau dieser Reihenfolge enthält. Jede Änderung an der Tabelle wird die Abfrage unterbrechen.

Die zweite Abfrage beruht nur darauf, dass es diese drei Felder in der Tabelle gibt, und die Reihenfolge der Felder ist irrelevant. Sie können die Reihenfolge der Felder in der Tabelle ändern, ohne die Abfrage zu unterbrechen, und Sie können sogar Felder hinzufügen, solange sie Nullwerte zulassen oder einen Standardwert haben.

Obwohl Sie das Tabellenlayout nicht sehr oft neu anordnen, ist das Hinzufügen weiterer Felder zu einer Tabelle durchaus üblich.

Auch die zweite Abfrage ist besser lesbar. Sie können aus der Abfrage selbst erkennen, was die Werte in den Datensatz bedeuten.

    
___ answer 1082959 ___

Mir sind theoretische Konzepte in dieser Hinsicht nicht wirklich wichtig (wie in der Praxis hat eine Tabelle eine definierte Spaltenreihenfolge). Der Hauptgrund, warum ich die zweite der ersten bevorzugen würde, ist eine zusätzliche Abstraktionsebene . Sie können Spalten in einer Tabelle ändern, ohne Ihre Abfragen zu verwirren.

    
___ answer 1082958 ___

Die erste Abfrage bricht jedes Mal, wenn sich das Tabellenschema ändert. Die zweite Abfrage berücksichtigt jede Schemaänderung, die ihre Spalten intakt lässt und keine standardmäßigen Spalten hinzufügt.

Personen, die %code% Abfragen durchführen und sich dann auf die Positionsnotation verlassen, um die Werte zu extrahieren, um die sie besorgt sind, sind Softwarewartungs-Superschurken     

___ answer1083004 ___

SQL gibt Ihnen die Syntax zum Angeben des Spaltennamens für INSERT- und SELECT-Anweisungen. Sie sollten dies verwenden, weil:

  • Ihre Abfragen sind stabil gegenüber Änderungen in der Spaltenreihenfolge, sodass die Wartung weniger Zeit in Anspruch nimmt.
  • Die Reihenfolge der Spalten ist besser auf die Art und Weise abgestimmt, wie die Leute denken, sodass sie besser lesbar ist. Es ist klarer, sich eine Spalte als die "Name" -Spalte und nicht als die zweite Spalte vorzustellen.
___ answer1083076 ___

Etwas, das noch nicht erwähnt wurde, ist, dass Sie oft einen Ersatzschlüssel als PK haben, mit %code% (oder etwas Ähnlichem), um einen Wert zuzuweisen. Bei der ersten Methode müssten Sie etwas angeben. Aber welchen Wert können Sie angeben, wenn er nicht verwendet werden soll? %code% könnte eine Option sein, aber das passt nicht wirklich, wenn man bedenkt, dass der PK auf %code% gesetzt wäre.

Aber abgesehen davon ist das Ganze "an ein bestimmtes Schema gebunden" ein viel wichtigerer Grund, IMO.

    
___ answer1083066 ___

Ich bevorzuge die UPDATE-ähnliche Syntax:

%Vor%

Das ist viel einfacher zu lesen und zu pflegen als beide Beispiele.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ answer4510708 ___

Ich werde eine weitere Sache hinzufügen, die zweite Abfrage ist weniger anfällig für Fehler, sogar bevor Tabellen geändert werden. Warum sage ich das? Aufgrund des Seocnd-Formulars können Sie (und sollten beim Schreiben der Abfrage) visuell prüfen, ob die Spalten in der Einfügetabelle und die Daten in der Klausel values ​​oder select tatsächlich in der richtigen Reihenfolge liegen. Andernfalls könnte es passieren, dass Sie die Sozialversicherungsnummer aus Versehen in das Honorarfeld eingeben und den Sprechern ihre SSN zahlen anstatt den Betrag, den sie für eine Rede leisten sollten (Beispiel nicht willkürlich gewählt, außer dass wir es vorher eingefangen haben) Sichtprüfung!).

    
___ answer1083074 ___

Langfristig, wenn Sie Ihrer Tabelle eine weitere Spalte hinzufügen, funktioniert Ihr INSERT nur, wenn Sie die Spaltenliste explizit angeben. Wenn jemand die Reihenfolge der Spalten ändert, kann Ihr INSERT im Hintergrund erfolgreich Werte in falsche Spalten einfügen.

    
___ tag123tuples ___ Bei der Programmierung sind Tupel einfache * Produkttypen *, die geordnete Sammlungen von Typen darstellen. ___ tag123relationalmodel ___ Für Fragen zur Verwendung des relationalen Modells für Datenbanken. ___ tag123datellierrelations ___ Eine Relation ist eine Datenstruktur, die aus einer Überschrift und einer ungeordneten Menge von Tupeln besteht, die denselben Typ haben. ___ tag123relationalalgebra ___ Relationale Algebra ist ein Abkömmling der Logik erster Ordnung und der Algebra von Mengen, die sich mit Relationen (Mengen von Tupeln) befassen. In der Informatik wird relationale Algebra häufig im Umgang mit Datenbanken verwendet. Operatoren in der relationalen Algebra verwenden Relationen als Operanden und erzeugen als Ergebnis eine Relation. ___ answer1082961 ___

Obwohl die Reihenfolge der Spalten im Schema definiert ist, sollte sie im Allgemeinen nicht als wichtig angesehen werden, da sie nicht konzeptionell wichtig ist.

Es bedeutet auch, dass jeder, der die erste Version liest, das Schema konsultieren muss, um herauszufinden, was die Werte bedeuten sollen. Zugegeben, das ist so, als würde man in den meisten Programmiersprachen Positionsargumente verwenden, aber irgendwie fühlt sich SQL in dieser Hinsicht etwas anders - ich würde die zweite Version sicherlich leichter verstehen (vorausgesetzt, die Spaltennamen sind vernünftig).

    
___
Mehrdad Afshari 04.07.2009 21:01
quelle
2

Sie sollten versuchen, Ihre SQL-Abfragen so wenig wie möglich vom genauen Layout der Tabelle abhängig zu machen.

Die erste Abfrage beruht darauf, dass die Tabelle nur drei Felder in genau dieser Reihenfolge enthält. Jede Änderung an der Tabelle wird die Abfrage unterbrechen.

Die zweite Abfrage beruht nur darauf, dass es diese drei Felder in der Tabelle gibt, und die Reihenfolge der Felder ist irrelevant. Sie können die Reihenfolge der Felder in der Tabelle ändern, ohne die Abfrage zu unterbrechen, und Sie können sogar Felder hinzufügen, solange sie Nullwerte zulassen oder einen Standardwert haben.

Obwohl Sie das Tabellenlayout nicht sehr oft neu anordnen, ist das Hinzufügen weiterer Felder zu einer Tabelle durchaus üblich.

Auch die zweite Abfrage ist besser lesbar. Sie können aus der Abfrage selbst erkennen, was die Werte in den Datensatz bedeuten.

    
Guffa 04.07.2009 21:16
quelle
2

Etwas, das noch nicht erwähnt wurde, ist, dass Sie oft einen Ersatzschlüssel als PK haben, mit auto_increment (oder etwas Ähnlichem), um einen Wert zuzuweisen. Bei der ersten Methode müssten Sie etwas angeben. Aber welchen Wert können Sie angeben, wenn er nicht verwendet werden soll? NULL könnte eine Option sein, aber das passt nicht wirklich, wenn man bedenkt, dass der PK auf NOT NULL gesetzt wäre.

Aber abgesehen davon ist das Ganze "an ein bestimmtes Schema gebunden" ein viel wichtigerer Grund, IMO.

    
Michael Madsen 04.07.2009 22:21
quelle
1

SQL gibt Ihnen die Syntax zum Angeben des Spaltennamens für INSERT- und SELECT-Anweisungen. Sie sollten dies verwenden, weil:

  • Ihre Abfragen sind stabil gegenüber Änderungen in der Spaltenreihenfolge, sodass die Wartung weniger Zeit in Anspruch nimmt.
  • Die Reihenfolge der Spalten ist besser auf die Art und Weise abgestimmt, wie die Leute denken, sodass sie besser lesbar ist. Es ist klarer, sich eine Spalte als die "Name" -Spalte und nicht als die zweite Spalte vorzustellen.
James Thompson 04.07.2009 21:28
quelle
1

Ich bevorzuge die UPDATE-ähnliche Syntax:

%Vor%

Das ist viel einfacher zu lesen und zu pflegen als beide Beispiele.

    
Peter Boughton 04.07.2009 22:15
quelle
1

Langfristig, wenn Sie Ihrer Tabelle eine weitere Spalte hinzufügen, funktioniert Ihr INSERT nur, wenn Sie die Spaltenliste explizit angeben. Wenn jemand die Reihenfolge der Spalten ändert, kann Ihr INSERT im Hintergrund erfolgreich Werte in falsche Spalten einfügen.

    
A-K 04.07.2009 22:20
quelle
0

Ich werde eine weitere Sache hinzufügen, die zweite Abfrage ist weniger anfällig für Fehler, sogar bevor Tabellen geändert werden. Warum sage ich das? Aufgrund des Seocnd-Formulars können Sie (und sollten beim Schreiben der Abfrage) visuell prüfen, ob die Spalten in der Einfügetabelle und die Daten in der Klausel values ​​oder select tatsächlich in der richtigen Reihenfolge liegen. Andernfalls könnte es passieren, dass Sie die Sozialversicherungsnummer aus Versehen in das Honorarfeld eingeben und den Sprechern ihre SSN zahlen anstatt den Betrag, den sie für eine Rede leisten sollten (Beispiel nicht willkürlich gewählt, außer dass wir es vorher eingefangen haben) Sichtprüfung!).

    
HLGEM 22.12.2010 15:31
quelle