ホームページ  >  記事  >  バックエンド開発  >  データベース最適化設計_PHP チュートリアル

データベース最適化設計_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:35:36976ブラウズ

プロジェクトでは、ニーズが変化し続けるため、ビジネス ニーズを満たすために元のライブラリ テーブル構造にフィールドを追加する必要があることがよくあります。

簡単な例を挙げてください:

あるウェブサイトのユーザー情報を保存するデータベーステーブルが必要です。通常の状況では、ユーザー情報には (アカウントがアクティブなアカウントであるかどうか、アカウントが電子メール アドレスにバインドされているかどうか、アカウントが製品を購入したかどうか、アカウントの有効期限が切れているかどうかなど) を含める必要があります。このデータベーステーブルを次のように設計します:

リーリー

上記の方法で設計した場合、フィールドの追加など要件が変わったときにアカウントが有効かどうか。次に、別のフィールド「F005」を追加する必要がありますが、管理が非常に面倒になります。新しいフィールドを追加すると、すべてのデータまたは履歴データを更新する必要があり、データの損失が発生しやすくなります。

それでは、この問題を解決し、データフィールド間の相関関係の影響をできるだけ減らすにはどうすればよいでしょうか。これらのフィールドを 1 つのフィールドに統合する方法が登場しました。例: 「FLAG」フィールドは 10 進数表記で保存されます (最初の桁: 1: アクティブ、0: 非アクティブ。2 桁目: 1: バインド済み、2: アンバインド。3 桁目: 1: 購入した製品、0: 非アクティブ購入した....)、説明: このフィールドの値が 5 の場合、バイナリに変換すると 101、最初の桁は 1、2 桁目は 0、3 桁目は 1 になります。つまり、アカウントがは「アクティブで、バインドされていない、購入済みの製品」です。このアプローチの利点は何ですか? 利点は、各タイプ間の関係が非常に小さく、1 つのフィールド タイプを更新しても他のフィールドに影響を与えないことです。では、この設計ではどのようにクエリを実行すればよいでしょうか? たとえば、ビット単位の AND を使用して、購入したすべての製品とアクティブなアカウントをクエリする必要がある場合、つまり (最初と 3 桁が 1)、他の桁を 0 で埋めます、つまり 101=5 になります。

SQL文クエリ:

リーリー

上記の SQL ステートメントは、製品を購入しアクティブなアカウントをクエリできます。

その後、更新および変更するときは、バックグラウンド プログラムで各バイナリ ビットを必要な値、つまり 101 に更新するだけで済みます。これを購入済みに変更したい場合は、しかしアクティブではない場合は、(5&1)=1 を使用して 3 番目のビットを 0 に設定します。ここでは、プログラム ビジネスを非常にうまく処理できる PHP 関数を紹介します。

リーリー

http://www.bkjia.com/PHPjc/743382.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/743382.html技術記事プロジェクトでは、ニーズが変化し続けるため、ビジネス ニーズを満たすために元のライブラリ テーブル構造にフィールドを追加する必要があることがよくあります。 簡単に教えてください...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。