私には質問モデルがあり、StackOverflow と同じように、ユーザーは各質問に複数の説明タグを付けることができます。
私が判断しようとしているのは、質問に関連付けられたタグをデータベースの別のテーブルに保存する必要があるかどうかです。
または、スペースで区切られた文字列のリストとして、質問テーブルの単一のフィールドとしてタグを保存できますか?
どちらがより理にかなっているのかわかりません。データを分離する正当な理由はありますか?
私には質問モデルがあり、StackOverflow と同じように、ユーザーは各質問に複数の説明タグを付けることができます。
私が判断しようとしているのは、質問に関連付けられたタグをデータベースの別のテーブルに保存する必要があるかどうかです。
または、スペースで区切られた文字列のリストとして、質問テーブルの単一のフィールドとしてタグを保存できますか?
どちらがより理にかなっているのかわかりません。データを分離する正当な理由はありますか?
タグを独自のテーブルに分離し、タグと質問の間の多対多の関係を持つ追加のテーブルを追加することは、リレーショナル ランド広告の「通常の形式」で知られています。特定のタグでタグ付けされたすべての質問を取得したり、最も人気のあるタグを見つけたりするなどのタスクをより簡単かつ迅速に実行できます。
(ご存じない場合に備えて -- 「多対多の関係」とは、2 つの列 [タグへの外部キーと質問への外部キー] のみを持つテーブルであり、一意性制約はありません)。
複数の値を持つ属性にカンマ区切りの文字列を使用することは、もう 1 つの SQL アンチパターンです。:-)
文字列の長さはどれくらい必要ですか? 別の言い方をすれば、特定のエントリにはいくつのタグを付けることができるでしょうか? (個々のタグの長さによって異なります。)
区切り文字を含む文字列をどのように説明しますか? 現在区切り文字として使用している文字が、タグ内の正当な文字になったらどうしますか?
SQLでリストから要素をどのように挿入または削除しますか? (リスト全体をアプリケーションにフェッチし、リストを展開し、フィルター処理して、データベースに再ポストする必要があります。)
COUNT(*)
SQLのように集計を行うにはどうすればよいですか?
特定のタグを共有するすべてのエントリを効率的に検索するにはどうすればよいでしょうか? (コストのかかるパターン マッチング クエリを使用する必要があります。)
このスレッドの他のほとんどの人がアドバイスしているように、解決策は別のテーブルを使用することです。
質問を 1 つのテーブルに、タグを 1 つのテーブルに配置し、タグを質問に接続する別のテーブルを用意します。これは、そのデータベースを構築するための最良の方法です。すべてのタグの一貫性を保ち、冗長性を大幅に削減します。
このようにデータを区切ることで、特定のタグを検索しても同じアイテムが返ってくることを保証できます。すべての質問でタグのスペルが同じかどうかを気にする必要はありません。また、この方法でタグ オプションを簡単に制限できます。
タグは必ず別のテーブルに格納する必要があります。これにより、すべてが簡単になります。これが「リレーショナル」データベースの全体的な考え方です。