ホームページ > バックエンド開発 > PHPチュートリアル > データベースの非正規化設計: PHP プログラミングでのアプリケーション

データベースの非正規化設計: PHP プログラミングでのアプリケーション

PHPz
リリース: 2023-06-22 19:14:01
オリジナル
946 人が閲覧しました

インターネット技術の急速な発展に伴い、データの保存および管理センターとしてのデータベースは、現代の情報時代に不可欠な部分となっています。データベースを設計するとき、多くの開発者は、データ テーブルの構造が合理的で標準化され、メンテナンスやクエリに便利になるように、データベースの標準化された設計理論にできる限り近づけることを望んでいます。ただし、場合によっては、非正規化は、冗長データと適切なデータ構成を通じてデータ ストレージとアクセスの効率を最適化する非常に有用な手法でもあります。 PHP プログラミングでは、アンチパラダイム設計により、パフォーマンスが大幅に向上し、データベース マシンの負荷が軽減され、データベースのスケーラビリティが向上し、開発サイクルが短縮されます。この記事では、アンチパラダイム設計の原則、実装、および適用可能なシナリオの側面から PHP について説明します。プログラミングで脱パラダイム設計を使用します。

1. 正規化設計と非正規化設計

データベースを設計する場合、合理的な正規化設計は、データ テーブルの構造をより標準化、簡潔かつ正確にし、操作を簡素化し、コストを削減することを目的としています。開発の難しさとデータの冗長性を軽減し、データ伝送とセキュリティを向上させます。データベース正規化理論には主に 1NF (第 1 正規形)、2NF (第 2 正規形)、3NF (第 3 正規形) などのいくつかのレベルがあり、属性の原子性、エンティティ間の関係依存性、データの冗長性を制限します。 。

非正規化設計は、その逆の概念です。特定のデータの冗長性を高め、クエリを最適化し、高速化することで、データベースのパフォーマンスを向上させることを目的としています。これは主に、フィールドの分割などの非正規化によって実現されます。複数のテーブルに分割して、データ量を削減します。クエリ時に JOIN 操作を実行するか、更新時に JOIN を回避するために冗長データを複数のテーブルに格納します。ただし、アンチパラダイム設計にも一定の制限があり、ほとんどの場合、依然として優れたパラダイム設計が第一選択となります。

2. 非正規化設計の適用シナリオ

非正規化設計で従うべき原則は、設計を比較検討する際に、開発者のニーズとユーザー指向のニーズを考慮する必要があるということです。考慮に入れられます。

  1. クエリ要件が高いシナリオ

頻繁なクエリが必要な場合、非正規化設計を使用するとクエリ効率が最適化され、JOIN 操作や多層クエリなどを削減できます。 、ユーザーのログイン情報、注文の詳細などは、最初にキャッシュにロードされ、ページが表示されるときに直接出力できます。

  1. データベースへの書き込みまたはアクセスが大量にある場合

非正規化設計を使用すると、データベースへの負荷が軽減され、変更する必要のない一部のデータが分割される可能性があります。複数のテーブルで、書き込み中のロックを回避するために、たとえば、製品価格、特定のテキスト説明などを最初にどこかにキャッシュし、実際の書き込み時にキャッシュから取得できます。

  1. 一部のデータを適時に更新/削除する必要があるシナリオ

非正規化設計を使用すると、UPDATE と DELETE が非効率すぎる状況を回避することもできます。データ量が多い場合、UPDATEやDELETE操作では多くのリソースを消費しますが、非正規化設計により一部のデータを複数のテーブルに書き込むことで分散処理や部分的な更新・削除を実現します。

3. PHP プログラミングで非正規化設計を適用するにはどうすればよいですか?

以下は、非正規化設計の使用方法を示す具体的な PHP プログラミングの例です。

  1. 前提: 注文番号、製品 ID、製品名などを表示する必要があります。注文詳細ページ 商品単価、商品数量、商品小計。テーブルは注文テーブルと商品テーブルの2つがあり、注文テーブルには注文番号、商品ID、商品数量のフィールドが含まれ、商品テーブルには商品ID、商品名、商品単価のフィールドが含まれます。
  2. 通常の設計計画: 2 つのテーブルを接続して、注文と対応する製品情報をクエリします。以下に示すように:
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';
ログイン後にコピー
  1. 非正規化設計計画: クエリ中の結合操作を減らすために、注文テーブルの製品名と製品単価フィールドを注文テーブルに冗長化します。以下に示すように:
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';
ログイン後にコピー
  1. 実装手順:

(1) order_tbl と product_tbl の 2 つのテーブルを作成します。

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;
ログイン後にコピー

(2) 注文テーブル order_tbl には、product_name と product_price という 2 つの冗長フィールドがあります。

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';
ログイン後にコピー

(3) オーダーを書き込むときは、order_tbl とキャッシュ テーブル 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}"}')";
ログイン後にコピー

(4) 注文を問い合わせる場合は、まずキャッシュテーブルcache_tblから商品名と価格を取得し、キャッシュに存在しない場合は商品テーブルproduct_tblから商品名と価格を問い合わせてキャッシュします。それらは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'";
ログイン後にコピー

この例では、キャッシュに Redis を使用します。注文の詳細をクエリするときは、まず製品名と価格をキャッシュから取得します。キャッシュに存在しない場合は、製品テーブルからクエリします。そしてそれらをキャッシュに書き込みます。この方法により、JOIN 操作が回避され、クエリの効率とパフォーマンスが大幅に向上します。

4. まとめ

アンチパラダイム設計には長所と短所の両方があり、合理的に適用することが鍵となります。データベースを設計する際には、実際の状況に基づいてさまざまなトレードオフを行い、メリットとデメリットを比較検討し、柔軟に設計手法を使用する必要があります。 PHP プログラミングでは、非正規化設計によるデータベース操作の最適化も非常に便利で実用的なテクノロジです。冗長データ、分散処理、キャッシュおよびインデックス戦略などの手段を追加することで、データベースのパフォーマンスと効率、システムの応答速度、ユーザー満足度を向上させることができます。

以上がデータベースの非正規化設計: PHP プログラミングでのアプリケーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート