0

mysqlに「cats」という名前のテーブルがあります。このテーブルには「cat_id」、「cat_parent」、「cat_name」があり、「cats_details」という名前の別のテーブルがあり、「cat_id」、「cat_description」、「cat_keywords」があります。 'など。私のカテゴリはネストでき(各メインカテゴリには無制限の数のサブカテゴリを含めることができ、各サブカテゴリには無制限の数のサブサブカテゴリを含めることができます、...)、カテゴリの数は1000を超える可能性があるためです。それらをいくつかのページにリストしてください:P。したがって、2つのテーブルを作成するのが最善の方法だと思います。1つはカテゴリを一覧表示して名前を検索するためのもので、もう1つはカテゴリの詳細を取得するためのものです。だから私の質問は、この場合の最良の方法は何ですか?

1-「cats_details」の「cat_id」をそれ自体の主キーとして使用し、「cats」テーブルの外部キーとして使用します。

2-「cats_details」の主キーに「id」(int自動増分)という名前の列を作成し、「cats」テーブルの外部キーとして「cats_details」に別の列「cat_id」を作成します。

多数のカテゴリと多数の訪問者に対して、このソリューションのどれがより高速ですか?

注: JOINは、リストページではなく、カテゴリ詳細ページでのみ使用します。

4

2 に答える 2

1

予想されるスケーラビリティの数値は? 事前のキャパシティ プランニングを行いましたか?

非正規化は、冗長データを作成することによって読み取り用にデータベースを最適化しますが、挿入または削除は、データベース内のデータのすべての冗長コピーに均一に適用されない場合、データの不整合を引き起こす可能性があります (したがって、データの整合性を維持することは現在アプリケーションの仕事であるため、いくらかのメンテナンス オーバーヘッドがあります)。 )。

テーブル内の何百万もの行を見ている場合を除き、現在のハードウェアでは問題ありません。正規化は問題ありません。

cat_id は int または Guid であると想定しています。主キーはクラスター化されたインデックスであり、読み取りが高速になるため、オプション 1 を使用すると読み取りが高速になります。ほとんどの場合、主キーで読み取り/結合を行うため、オプション 2 の cat_id はおそらく非クラスター化インデックスになるため、オプション 2 は効率が低くなります (ただし、この場合、挿入/削除は高速になります)。

于 2012-12-12T16:17:03.657 に答える
0

おそらく、テーブルの正規化を検討する必要があります。これで問題が解決するはずです。良いリンクはこれかもしれません: http: //www.troubleshooters.com/littstip/ltnorm.htmlしかし、テーブルの正規化に関するGoogle検索はあなたを助けるはずです...

于 2012-12-12T14:44:38.423 に答える