1

サーバーで一種のフォーラム変更コードを実行しています。私のデータベースには という巨大なテーブルがcoreあり、基本的に管理者が編集可能なすべての設定が含まれています。私の質問は、これを正規化する必要がありますか?

このテーブルの大きさを示すフィドルを作成しました: http://sqlfiddle.com/#!2/f4536/1

gear_notifications、などの列が表示されます。これらはgear_bankgear_*特定のシステムがオンになっているかどうかを示します。たとえば、 の場合gear_bank=1、銀行システムがオンになっています。現時点では__construct、DB ファイルで次のクエリを実行します。

$settings = mysql_query("SELECT GROUP_CONCAT(d.domain) AS domains, GROUP_CONCAT(d.zb) AS zb_info, c.* FROM core c JOIN domains d ON d.cid = c.id WHERE c.id ='$cid' LIMIT 1");

無視するJOINと、ここで問題がすぐにわかります。coreクエリは、対応するシステムがオンになっているかどうかに関係なく、テーブルからすべてのフィールドを返します。たとえば、 if gear_bank=0、クエリは引き続き 、 などを返しますbank_name。これによりbank_history_perpagebank_*コードの実行方法に物理的な問題は発生しませんが (必要のないデータは無視できるため)、そのデータをロードする必要はありません。

coreすべての値を持つと呼ばれる 1 つのテーブルを作成してから、対応する値に対応するテーブル ( など) を作成したほうがよいでしょうgear_*か?core_bankcore_*

私はしばらくの間これを照会してきました (悪いしゃれ、申し訳ありません!)、これが私のコードのパフォーマンスを向上させるかどうかを判断するのに十分な知識がありません。上記のクエリはすべてのページで実行されることに注意してください。

新しいシステム、つまり複数のテーブルに戻す場合、必要な情報をすべて取得するにはどうすればよいでしょうか? coreオンになっているシステムを特定するために1 つのクエリを実行してから、対応するすべてのテーブルに対して追加のクエリを実行したくありません。inJOINの値に基づいて必要なすべてのテーブルを sとする1 つのクエリが望ましいと思います。それは可能でしょうか?gear_*core

私はまだこのフォーラムの修正をリリースしていないので、実際に影響を与えずに好きなだけ変更を加えることができます:)

4

1 に答える 1

0

コアを複数のテーブルに分割する場合、NULL を使用して、特定のエントリに特定のシステムの情報があるかどうかを示すことができます。その後、結合は期待どおりに機能します。

ただし、テーブルは実際にはそれほど大きくないため、テーブルを分割することでアプリケーション レベルでの速度の向上に実際に気付くかどうかは疑わしいです。

個々の列に対してクエリを実行する必要がない場合は、1 つの TEXT 列のみを使用し、すべての属性を配列に入れてから、配列をテキスト列にシリアル化します。

于 2012-08-22T19:19:55.507 に答える