J'ai un entrées de table et une table dérivée ParamètresComment résoudre la duplication de code dans la requête PostgreSQL suivante?
CREATE TABLE Configurables
(
id SERIAL PRIMARY KEY
);
CREATE TABLE Inputs
(
configurable integer REFERENCES Configurables(id),
name text,
time timestamp,
PRIMARY KEY(configurable, name, time)
);
CREATE TABLE Parameters
(
configurable integer,
name text,
time timestamp,
value text,
FOREIGN KEY(configurable, name, time) REFERENCES Inputs(configurable, name, time)
);
Les contrôles de requête suivants si un paramètre a été modifié, ou est présent pas encore, et insère le paramètre avec une nouvelle valeur.
QString PostgreSQLQueryEngine::saveParameter(int configurable, const QString& name, const QString& value)
{
return QString("\
INSERT INTO Inputs(configurable, name, time) \
WITH MyParameter AS \
(\
SELECT configurable, name, time, value \
FROM \
(\
SELECT configurable, name, time, value \
FROM Parameters \
WHERE (configurable = %1) AND (name = '%2') AND time = \
(\
SELECT max(time) \
FROM Parameters \
WHERE (configurable = %1) AND (name = '%2') \
) \
UNION \
SELECT %1 AS configurable, '%2' AS name, '-infinity' AS time, NULL AS value \
)AS foo \
) \
SELECT %1 AS configurable, '%2' AS name, 'now' AS time FROM MyParameter \
WHERE time = (SELECT max(time) FROM MyParameter) AND (value <> '%3' OR value IS NULL); \
\
INSERT INTO Parameters(configurable, name, time, value) \
WITH MyParameter AS \
(\
SELECT configurable, name, time, value \
FROM \
(\
SELECT configurable, name, time, value \
FROM Parameters \
WHERE (configurable = %1) AND (name = '%2') AND time = \
(\
SELECT max(time) \
FROM Parameters \
WHERE (configurable = %1) AND (name = '%2') \
) \
UNION \
SELECT %1 AS configurable, '%2' AS name, '-infinity' AS time, NULL AS value \
)AS foo \
) \
SELECT %1 AS configurable, '%2' AS name, 'now' AS time, '%3' AS value FROM MyParameter \
WHERE time = (SELECT max(time) FROM MyParameter) AND (value <> '%3' OR value IS NULL); \
").arg(configurable).arg(name).arg(value);
}
Comment dois-je mieux résoudre la duplication 2 les sous-requêtes myParameter?
d'autres conseils sur le nettoyage d'une requête comme ceci
Est-ce que vous insérez la même configuration, nom et heure dans les deux tables. Vous avez déjà une clé étrangère dans les paramètres qui fait référence aux entrées. Avez-vous vraiment besoin de dé-normalisation? –
Ajouté Définition configurable. Un configurable a une liste d'entrées, une entrée peut être un paramètre. J'ai choisi de le normaliser pour que je puisse facilement obtenir une vue d'ensemble à partir de la table des entrées. (il y a plus de tables dérivant des entrées puis des paramètres) – Pieter