J'ai une base de données qui contient un historique des ventes de produits. Par exemple, le tableau suivantBase de données de conception Question concernant les informations en double
CREATE TABLE SalesHistoryTable (
OrderID, // Order Number Unique to all orders
ProductID, // Product ID can be used as a Key to look up product info in another table
Price, // Price of the product per unit at the time of the order
Quantity, // quantity of the product for the order
Total, // total cost of the order for the product. (Price * Quantity)
Date, // Date of the order
StoreID, // The store that created the Order
PRIMARY KEY(OrderID));
La table aura éventuellement des millions de transactions. À partir de là, des profils peuvent être créés pour des produits dans différentes régions géographiques (en fonction du StoreID). La création de ces profils peut prendre beaucoup de temps en tant que requête de base de données. Par exemple.
SELECT ProductID, StoreID,
SUM(Total) AS Total,
SUM(Quantity) QTY,
SUM(Total)/SUM(Quantity) AS AvgPrice
FROM SalesHistoryTable
GROUP BY ProductID, StoreID;
La requête ci-dessus pourrait être utilisée pour obtenir les informations basées sur des produits pour un magasin particulier. Vous pouvez ensuite déterminer quel magasin a le plus vendu, a fait le plus d'argent, et vend en moyenne pour le plus/le moins. Ce serait très coûteux à utiliser comme une requête normale exécutée à tout moment. Quelles sont les descisions de conception afin de permettre à ces types de requêtes de s'exécuter plus rapidement en supposant que la taille de stockage ne pose pas de problème. Par exemple, je pourrais créer une autre table avec des informations en double. ID de magasin (clé), ID de produit, TotalCost, QTY, AvgPrice Et fournir un déclencheur de sorte que lors de la réception d'une nouvelle commande, l'entrée pour ce magasin est mise à jour dans une nouvelle table. Le coût de la mise à jour est presque rien. Qu'est-ce qui devrait être pris en compte dans le scénario ci-dessus?
Votre propre réponse est spot-on pour ce genre de requête. La mise en cache des résultats dans la base de données fournira une accélération beaucoup plus importante que tout ce que vous pouvez faire. L'autre bonne chose à propos de cette approche est que si les choses ne sont plus synchronisées pour une raison ou une autre, vous pouvez tout jeter et recréer la table avec une seule requête. – roufamatic