2017-12-20 3 views
3

Die dritte Zeile jeder dieser Aussagen ist genau das gleiche:DRY - wie man wiederholten Code extrahiert ... zu einer gespeicherten Funktion?

statement1

SELECT * FROM `uploads` 
WHERE `uid` = :uid 
AND `deleted` <> 1 AND `archived` <> 1 

statement2

SELECT * FROM `uploads` 
WHERE `folder_id` = :folder_id 
AND `deleted` <> 1 AND `archived` <> 1 

Die dritte Zeile als auch in vielen anderen Aussagen verwendet wird , sagen wir 30 verschiedene Aussagen; In diesem erfundenen Beispiel heißt das: "Wir bekommen alle Dateien aus einer Upload-Tabelle ... die nicht gelöscht oder archiviert wurden". Wenn wir in der Zukunft ein drittes Qualifikationsmerkmal hinzufügen müssen (z. B. AND uploadsuccess = 1), müssten wir 30 verschiedene SQL-Anweisungen bearbeiten. Überhaupt nicht trocken. Wie können wir DRY-Prinzipien hier über SQL verwenden (MySQL in unserem Fall, wenn das ein wichtiger Faktor ist)?

Danke für jede Hilfe.

Antwort

3

Ich empfehle einen Blick:

CREATE OR REPLACE VIEW uploads_current AS 
    SELECT * FROM `uploads 
    WHERE `deleted` <> 1 AND `archived` <> 1; 

Dann können Sie es mit zusätzlichen Bedingungen abfragen:

SELECT * FROM `uploads_current` 
    WHERE `uid` = :uid; 

Sie später die Ansicht neu definieren:

CREATE OR REPLACE VIEW uploads_current AS 
    SELECT * FROM `uploads 
    WHERE `deleted` <> 1 AND `archived` <> 1 AND uploadsuccess = 1; 

Dann werden alle Code Das abgefragte uploads_current enthält implizit dieselbe Bedingung, ohne dass Codeänderungen erforderlich sind.

Lesen Sie mehr über ANSICHTEN: https://dev.mysql.com/doc/refman/5.7/en/create-view.html

3

Dies ist ein häufiges Problem, wollen wir alle Daten gespeichert werden, aber 99% der Fälle wir Filterung eine bestimmte Untergruppe von Daten aus.

Die Lösung, die ich normalerweise verwende, ist eine Sicht mit der Logik in erstellen, dann abfragen. Zum Beispiel:

CREATE VIEW `uploads_view` AS 
SELECT * FROM `uploads` 
WHERE `deleted` <> 1 
AND `archived` <> `; 

SELECT * FROM `uploads_view` WHERE `uid` = :uid; 

SELECT * FROM `uploads_view` WHERE `folder_id` = :folder_id 
+0

Ja, ich würde auch eine Ansicht machen. –

Verwandte Themen