"Tabelle der Konstanten" - ist das gängige Praxis?

8

College SQL-Klasse mit dem Buch "SQL Fundamentals" von John J. Patrick. Im dritten Kapitel spricht er über die Verwendung einer "Tabelle von Konstanten", um Spalten zu einer select-Anweisung hinzuzufügen, wobei alle Zeilen den gleichen Wert haben.

Wenn Sie beispielsweise die Tabelle "Zeichen" haben, wie folgt:

first_name  last_name  dept_code
----------- ---------- -------------------
Fred        Flintstone ROCKS
Barney      Rubble     ROCKS
Wilma       Flintstone FACEPALMING_AT_FRED

und Sie möchten ein SELECT, das allen Zeilen eine Spalte "Heimatstadt" mit dem Wert "BEDROCK" hinzufügt. Er empfiehlt, eine zweite Tabelle in der Datenbank "temp" mit zu erstellen

hometown
--------
BEDROCK

und dann tun

SELECT first_name, last_name, dept_code, hometown FROM characters, temp

Die Idee ist, dass dadurch vermieden wird, dass Zeichenfolgenkonstanten in die SELECT-Anweisung eingefügt werden. Wenn Sie viele SELECTs haben, die dieselben Konstanten benötigen, ist es einfacher, eine Tabelle zu aktualisieren als fünfzig Abfragen.

Die Sache ist, ich arbeite seit fünfzehn Jahren mit SQL-Datenbanken und habe diese Konstruktion noch nie gesehen. Ist es etwas völlig Häufiges, das ich gerade verpasst habe, oder ist es etwas, das ich aus meinem Gedächtnis löschen kann, nachdem diese Aufgabe beendet ist?

mjfgates
quelle

Antworten:

9

Joe Celko erwähnt in einigen seiner Bücher Konstantentabellen.

Er schlägt vor, bei Verwendung einer Tabelle eine Prüfbedingung hinzuzufügen, die sicherstellt, dass die Tabelle nicht mehr als eine Zeile enthalten darf.

CREATE TABLE Constants
(
lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY CHECK (lock = 'X'),
pi FLOAT DEFAULT 3.142592653 NOT NULL,
e FLOAT DEFAULT 2.71828182 NOT NULL,
phi FLOAT DEFAULT 1.6180339887 NOT NULL
);

Alternativ kann eine Ansicht für einen ähnlichen Zweck verwendet werden.

CREATE VIEW Constants
AS
SELECT *
FROM 
(VALUES(3.142592653,
        2.71828182,
        1.6180339887)) V(pi,e,phi)

Ich habe nicht viel, wenn überhaupt, selbst verwendet, aber es lohnt sich immer, zusätzliche mögliche Techniken in Betracht zu ziehen.

Der spezifische Anwendungsfall in Ihrer Frage würde ich jedoch nicht als Konstantentabelle betrachten. TBH, die fest codierte gleiche "Heimatstadt" für alle, scheint nur eine unsinnige Anforderung zu sein.

Martin Smith
quelle
2
Die Ansichtslösung ist ziemlich nett. Es schützt auch vor versehentlichen Änderungen der "Konstanten".
a_horse_with_no_name
Dies scheint jedoch eine ganz andere Art von Konstante zu sein als das veröffentlichte OP. Dies sind anwendungsunabhängige, invariante Werte. Das Beispiel des OP sind anwendungsabhängige Daten, von denen sich einige im Laufe der Zeit voraussichtlich ändern werden. Mir ist nicht klar, warum "Heimatstadt" als konstant angesehen wird.
Mike Sherrill 'Cat Recall'
@Catcall - Stimmen Sie zu, dass dies ein schlechtes Beispiel zu sein scheint. Neben Dingen, die tatsächlich konstant sind, könnte dies jedoch auch für globale Variablen verwendet werden. Ich habe über den Steuersatz nachgedacht, würde aber wahrscheinlich in der realen Welt historische Steuersätze dafür beibehalten wollen. Möglicherweise kann es verwendet werden, wenn dieselbe Datenbank für einige Anpassungsdaten auf mehreren Clients bereitgestellt wird.
Martin Smith
1
Ich habe dieses Beispiel direkt aus der Luft gezogen. Dies kann helfen, die Schlechtigkeit zu erklären. Der in dem Buch fügt ein "last_eval_date" zu einer Reihe von Mitarbeiterdatensätzen hinzu ... Ich würde das immer noch nicht so machen, aber vielleicht besser.
mjfgates
3

Nach meiner Erfahrung habe ich selten Code entwickelt, bei dem der Ergebnismenge eine Zeichenfolgenkonstante hinzugefügt wird. Die vorgeschlagene Lösung macht für mich keinen Sinn. Ich wäre sehr misstrauisch gegenüber der Codequalität eines Systems, das dies getan hat. Wenn ich mir dieses Beispiel anschaue, würde ich es wie folgt codieren.

first_name  last_name  dept_code
----------- ---------- ---------
Fred        Flintstone 1
Barney      Rubble     1
Wilma       Flintstone 2

dept_code dept_name
--------- -------------------
1         ROCKS
2         FACEPALMING_AT_FRED

SELECT first_name, last_name, dept_name, 'BEDROCK' AS hometown
FROM characters c 
JOIN departments d ON (c.dept_code = d.dept_code )

Ich würde seinen Ansatz nach dieser Übung vergessen. Damit dies funktioniert, benötigen Sie vor jeder Abfrage eine Tabelle oder Spalte für jede Konstante oder ein Update. Ich würde hoffen, dass irgendwann eine Adresstabelle hinzugefügt wird, aus der die Heimatstadt mit einem geeigneten Join ausgewählt werden kann.

BillThor
quelle
2

Wenn ich eine Konstante benötige, würde ich eine einfache skalare UDF in Betracht ziehen (SQL Server, aber andere RDBMS haben dieselbe). Ich habe dies getan, um "magische Zahlen" und CR / LF-Zeichenfolgen und dergleichen zu erfassen, wenn die Umstände dies erfordern, dass dies in der Datenbank vorhanden ist

Ein Beispiel aus SO: https://stackoverflow.com/a/2947405/27535

Das Beispiel, das Sie gegeben haben, scheint ein bisschen sinnlos zu sein. Wenn konstant, warum zu einer Ergebnismenge hinzufügen? Es sei denn, es handelt sich um einen NULL-Ersatzwert oder dergleichen.

gbn
quelle
Ich kann Enums verstehen ... aber dieses Buch befürwortet ausdrücklich einzeilige Tabellen mit einer einzelnen Konstante in jedem Feld, damit Sie der Ergebnismenge Konstanten hinzufügen können. Also das wtf? in der ursprünglichen Frage :)
mjfgates