Maison > développement back-end > tutoriel php > Conception de dénormalisation de bases de données : application en programmation PHP

Conception de dénormalisation de bases de données : application en programmation PHP

PHPz
Libérer: 2023-06-22 19:14:01
original
945 Les gens l'ont consulté

Avec le développement rapide de la technologie Internet, les bases de données, en tant que centres de stockage et de gestion de données, sont devenues un élément indispensable de l'ère moderne de l'information. Lors de la conception d'une base de données, de nombreux développeurs espèrent être aussi proches que possible de la théorie de conception standardisée de la base de données afin que la structure de la table de données soit raisonnable, standardisée et pratique pour la maintenance et les requêtes. Cependant, dans certains cas, la dénormalisation est également une technique très utile pour optimiser l’efficacité du stockage et de l’accès aux données grâce à des données redondantes et à une organisation appropriée des données. Dans la programmation PHP, la conception anti-paradigme peut considérablement améliorer les performances, réduire la charge de la machine de base de données, améliorer l'évolutivité de la base de données et raccourcir les cycles de développement. Cet article décrira PHP sous les aspects des principes de conception anti-paradigme, de la mise en œuvre et des scénarios applicables. utiliser la conception hors paradigme dans la programmation.

1. Conception normalisée et conception dénormalisée

Lors de la conception d'une base de données, une conception normalisée raisonnable vise à rendre la structure de la table de données plus standardisée, concise et précise, à simplifier les opérations, à réduire les difficultés de développement et le degré de redondance des données pour améliorer les données. transmission et sécurité. La théorie de la normalisation des bases de données comporte principalement plusieurs niveaux tels que 1NF (première forme normale), 2NF (deuxième forme normale), 3NF (troisième forme normale), etc., qui limitent l'atomicité des attributs, les dépendances relationnelles entre les entités et l'aspect de redondance des données. .

La conception de la dénormalisation est le concept opposé. Elle vise à améliorer les performances de la base de données en augmentant la redondance de certaines données, en optimisant les requêtes et en accélérant. Ceci est principalement réalisé grâce à la dénormalisation, comme la division des champs en plusieurs tables pour réduire les opérations de JOIN lors de l'interrogation ou du stockage. données redondantes dans plusieurs tables pour éviter JOIN lors de la mise à jour. Cependant, la conception anti-paradigme présente également certaines limites. Dans la plupart des cas, une excellente conception paradigmatique reste le premier choix.

2. Scénarios d'application de la conception de dénormalisation

Le principe qui doit être suivi dans la conception de dénormalisation est que lors de l'évaluation de la conception, les besoins des développeurs et les besoins orientés utilisateur doivent être pris en compte.

  1. Scénarios avec des exigences de requête élevées

Lorsque des requêtes fréquentes sont requises, l'utilisation de la conception de dénormalisation peut optimiser l'efficacité des requêtes et réduire les requêtes inutiles telles que les opérations JOIN et les requêtes multicouches, telles que : les informations de connexion de l'utilisateur, les commandes. Pour plus de détails, vous peut d'abord charger le cache et le sortir directement lorsque la page est affichée.

  1. Lorsque la base de données a un volume élevé d'écritures ou d'accès

L'adoption d'une conception de dénormalisation peut réduire la pression sur la base de données, diviser certaines données qui n'ont pas besoin d'être modifiées en plusieurs tables et éviter les verrous lors de l'écriture, etc. Par exemple, les prix des produits, certaines descriptions textuelles, etc. peuvent d'abord être mis en cache quelque part, puis récupérés du cache lorsqu'ils sont réellement écrits.

  1. Scénarios dans lesquels certaines données doivent être mises à jour/supprimées à temps

L'utilisation de la conception de dénormalisation peut également éviter l'inefficacité de UPDATE et DELETE. Lorsque la quantité de données est importante, les opérations UPDATE et DELETE consomment beaucoup de ressources. Grâce à la conception de dénormalisation, certaines données peuvent être écrites dans plusieurs tables pour réaliser un traitement distribué et une mise à jour/suppression partielle.

3. Comment appliquer la conception sans paradigme dans la programmation PHP ?

Ce qui suit est un exemple de programmation PHP spécifique pour montrer comment utiliser la conception de dénormalisation :

  1. Prémisse : le numéro de commande, l'ID du produit, le nom du produit, le prix unitaire du produit, la quantité du produit et le sous-total du produit doivent être affichés sur la page de détails de la commande. Il existe deux tables, la table des commandes et la table des produits. La table des commandes contient les champs du numéro de commande, de l'ID du produit et de la quantité du produit, et la table des produits contient les champs de l'ID du produit, du nom du produit et du prix unitaire du produit.
  2. Plan de conception normal : recherchez les commandes et les informations sur le produit correspondantes en connectant deux tables. Comme indiqué ci-dessous :
SELECT order_no, product_id, product_name, product_price, product_qty, (product_price * product_qty) AS sub_total 
FROM order_tbl
LEFT OUTER JOIN product_tbl
ON order_tbl.product_id = product_tbl.product_id
WHERE order_no = '1001';
Copier après la connexion
  1. Plan de conception de dénormalisation : redondant les deux champs de nom du produit et de prix unitaire du produit dans la table de commande vers la table de commande pour réduire les opérations de jointure pendant la requête. Comme indiqué ci-dessous :
SELECT order_no, product_id, product_name, product_price, product_qty, (product_price * product_qty) AS sub_total 
FROM order_tbl
WHERE order_no = '1001';
Copier après la connexion
  1. Étapes de mise en œuvre :

(1) Créez deux tables : order_tbl et product_tbl.

CREATE TABLE `order_tbl` (
  `order_no` varchar(100) NOT NULL,
  `product_id` int(11) NOT NULL,
  `product_qty` int(11) NOT NULL,
  `product_name` varchar(100) DEFAULT NULL,
  `product_price` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`order_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `product_tbl` (
  `product_id` int(11) NOT NULL,
  `product_name` varchar(100) NOT NULL,
  `product_price` decimal(10,2) NOT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Copier après la connexion

(2) Il y a deux champs redondants dans la table de commande order_tbl : product_name et product_price.

ALTER TABLE `order_tbl` ADD COLUMN `product_name` VARCHAR(100) NOT NULL DEFAULT '';
ALTER TABLE `order_tbl` ADD COLUMN `product_price` DECIMAL(10,2) NOT NULL DEFAULT '0.00';
Copier après la connexion

(3) Lors de l'écriture d'une commande, écrivez les données dans order_tbl et dans la table de cache cache_tbl.

//写入订单表
$sql = "INSERT INTO order_tbl(order_no, product_id, product_qty, product_name, product_price) 
        VALUES ('$order_no', $product_id, $product_qty, '$product_name', $product_price)";

//写入缓存表
$sql_cache = "INSERT INTO cache_tbl(key_name, cache_value) 
              VALUES ('product_info_${product_id}','{"product_name":"${product_name}", "product_price":"${product_price}"}')";
Copier après la connexion

(4) Lors de l'interrogation d'une commande, obtenez d'abord le nom et le prix du produit dans la table de cache cache_tbl. S'ils n'existent pas dans le cache, interrogez le nom et le prix du produit dans la table des produits product_tbl et mettez-les en cache dans cache_tbl.

$redis = new Redis(); 
$redis->connect('127.0.0.1', 6379);

$key_name = "product_info_${product_id}";
if ($redis->exists($key_name)) {
  $cache_data = json_decode($redis->get($key_name), true);
  $product_name = $cache_data['product_name'];
  $product_price = $cache_data['product_price'];
} else {
  $sql = "SELECT product_name, product_price FROM product_tbl WHERE product_id=$product_id";
  $result = mysqli_query($conn, $sql);
  $row = mysqli_fetch_array($result);
  $product_name = $row['product_name'];
  $product_price = $row['product_price'];
  $redis->set($key_name, json_encode(['product_name'=>$product_name, 'product_price'=>$product_price]));
}

$sql = "SELECT order_no, product_id, product_name, product_price, product_qty, (product_price * product_qty) AS sub_total 
        FROM order_tbl
        WHERE order_no = '1001'";
Copier après la connexion

Dans cet exemple, nous utilisons Redis pour la mise en cache. Lors de l'interrogation des détails de la commande, nous obtenons d'abord le nom du produit et le prix du cache. S'ils n'existent pas dans le cache, nous les interrogeons dans la table des produits et les écrivons dans. la cache. Grâce à cette méthode, nous évitons les opérations JOIN et améliorons considérablement l'efficacité et les performances des requêtes.

4. Résumé

La conception anti-paradigme présente à la fois des avantages et des inconvénients, et une application raisonnable est la clé. Lors de la conception d'une base de données, vous devez faire divers compromis en fonction de la situation réelle, peser le pour et le contre et utiliser les méthodes de conception avec flexibilité. En programmation PHP, l'optimisation des opérations de base de données grâce à la conception de dénormalisation est également une technologie très utile et pratique. Nous pouvons améliorer les performances et l'efficacité des bases de données, la vitesse de réponse du système et la satisfaction des utilisateurs en ajoutant des données redondantes, des stratégies de traitement distribué, de mise en cache et d'indexation et d'autres moyens.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal