長いトピックで申し訳ありません。これほど長くするつもりはありませんでしたが、これは私が抱えていた非常に単純な問題です。:)
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段落のデータを保持するために使用する理想的な列タイプは何ですか?