0

長いトピックで申し訳ありません。これほど長くするつもりはありませんでしたが、これは私が抱えていた非常に単純な問題です。:)

tagsとという列を持つtag_id単純なテーブルがあるとしますtag。tag_id は単なる自動インクリメント列であり、tag はタグのタイトルです。説明フィールドを追加する必要がある場合、それは平均して約 1 ~ 2 段落 (最大でおそらく 3 ~ 4 段落) であり、単純に説明フィールドをテーブルに追加するか、tag_descriptions という名前の新しいテーブルを作成して保存する必要があります。 tag_id? の説明

説明を選択しないクエリを実行すると、その説明フィールドは依然として mysql を遅くするため、これを行う方が良いと読んだことを覚えています。これは本当ですか?それをどこから読んだか覚えていませんが、ここ数年はそれに従っています... 最後に、これを行う必要があるかどうか疑問に思います。また、説明フィールドが必要な場合はいつでも内部結合する必要があります。

私が持っている別の質問は、最大で非常に少数の行しか保持しない新しいテーブルを作成するのは一般的に悪いことですか? このデータが他のどこにも当てはまらない場合はどうなりますか?

以下に、これら 2 つの質問に関連する簡単なケースを示します。

多対多の関係を構成する 3 つのテーブル content、tags、および content_tags があります。

コンテンツ

  • content_id
  • リージョン (約 6 ~ 7 個の異なる値を持つ列挙列で、後で大きくなることはほとんどありません)

タグ

  • tag_id
  • 鬼ごっこ

content_tags

  • content_id
  • tag_id

タグごとに 1 ~ 2 段落程度の説明を保存したいだけでなく、地域ごとにも説明を保存したいと考えています。これを行うための最良の方法は何だろうかと思いますか?

オプション A:

  • タグテーブルに説明列を追加するだけです
  • region_descriptions の新しいテーブルを作成する

オプション B:

  • フィールドを持つ説明と呼ばれる新しいテーブルを作成します: id、説明、およびタイプ
  • id は、コンテンツの id または列挙型フィールドの id になります。
  • タイプは、それがタグの説明であるか、領域の説明であるかです (これには enum 列を使用します)

多分IDとタイプに主キーがありますか?

オプション C:

  • tag_descriptions の新しいテーブルを作成する
  • region_descriptions の新しいテーブルを作成する

オプション A は、説明列を追加しても、説明を必要としない mysql select クエリの速度が低下しない場合に適しているようです。

説明列が mysql の速度を低下させると仮定すると、オプション B が適切な選択になる可能性があります。また、リージョンの説明を保持するわずか 6 ~ 7 行の小さなテーブルが不要になります。考えてみると、もともとリージョンの説明を取得するために非常に小さな行を通過するだけでよい場合、このテーブルへの接続は遅くなるでしょうか。

オプション C は、説明列が mysql の速度を低下させ、領域の説明のような小さなテーブルが問題にならない場合に理想的です。

これらのオプションのどれもが最適ではない可能性があります。別のオプションを自由に提供してください。ありがとう。

PS通常は1〜2段落のデータを保持するために使用する理想的な列タイプは何ですか?

4

3 に答える 3

0

毎分数千のクエリを処理しなければ、それほど重要ではないと思います。毎分無数のクエリが発生する場合は、さまざまなオプションを実装し、これらすべてのオプションのベンチマークを実行します。結果に基づいて、決定を下すことができます。

于 2011-01-20T19:36:59.093 に答える
0

私の (確かにやや無知な) 意見では、実際には両方をどれだけ使用するかにかかっています。

適切に索引付けされている場合、その JOIN はそれほど高価ではありません。また、大きなテーブルは遅くなります。インデックス作成はこの問題を大幅に軽減しますが、キャッシングを抑制し、アクセスに時間がかかります。

タグ名をタグ ID に結合することが多く、説明を使用することはめったにない場合は、別のテーブルを使用することをお勧めします。説明をより頻繁に使用する場合は、1 つの表を使用してください。

于 2011-01-20T19:27:07.260 に答える
0

質問の最初の部分について: ID、名前、説明を含むタグがある場合は、それを 1 つのテーブルに保存する必要があります。

さて、このクエリ

 SELECT name FROM tags WHERE id = 1;

そこに 1、2、または 20 の余分なフィールドがある場合、速度が低下することはありません。

于 2011-01-20T19:27:59.347 に答える