1

現在の状況では、トピックは3つの主要なカテゴリでソートされています。3つ以上のカテゴリを追加する可能性がありますが、上位のアップは、トピックに1つ以上のカテゴリを追加する機能を実装したいと考えています。

私の元のデータベース設計では、トピック情報テーブルの外部キーとしてcategoryIDがあります。これは最初からおそらく悪い考えでしたが、カテゴリが3つしかないように設定されていて、この方法でクエリを実行できるようになると思いました。

したがって、私が見ることができることから、2つのオプションがあります。1)phpの最後で解析するコンマ区切りの文字列としてcategoryIDを入力します。2)DBを再構築し、categoryIDをcategoryIDとtopicIDの独自のテーブルに引き出します。

みんなどう思ったのかしら。私の最初の本能は、データベースを再構築することでした。しかし、私が考えるときの最初のオプションは、実装するのが最も簡単で、データベースを変更することによって既存のものを壊す可能性が最も低いです。ただし、これにより非正規化が発生し、データに一貫性がなくなる可能性があります。

パフォーマンスと引き換えに一貫性のないデータが発生するリスクを受け入れる限り、非正規化は問題ないことを読みました。あなたの意見では、私はこのリスクのパフォーマンスで多くを得るでしょうか?この状況で私が何をすべきかについての意見をいただければ幸いです。

助けてくれてありがとう、
リーバイス

4

3 に答える 3

3

非正規化(その良い例は、「投票」テーブルから毎回計算するのではなく、質問と一緒にSO質問の投票数を維持することです)を、IDのコンマ区切りリストである忌まわしきものと混同しないでください。

適切な多対多の関係をモデル化します。カンマ区切りのアプローチでは、うまくいかない可能性がある(そしてうまくいかない)ことがたくさんあります。いくつか例を挙げると:

  1. 参照整合性はありません。
  2. 結合で使用することはほぼ不可能です。
  3. 適切にインデックスを作成することはできません。スケーラブルではありません。
于 2009-10-29T02:48:19.657 に答える
0

あなたが言ったように、あなたの最良の選択肢は、トピックがどのカテゴリーに属するかを見つけるために、categoryID-topicIDペアのデータベースを持つことです。

categoryIDの文字列を展開することで別の方法で実行できますが、特定のカテゴリに含まれるトピックを検索する場合は、各フィールドを実行してLIKEを実行する必要があります...はるかに多くのリソースを消費します。

時間をかけてDBを再構築すると、はるかに優れた結果が得られます。

于 2009-10-29T02:50:20.543 に答える
0

個々のアイテムを使用してDBMSで何かを行う必要がある場合は、それらをリスト形式で保存しないでください。これにより、テーブルが大きくなるにつれて、クエリが犬のように実行されます。もちろん、リストを1つの単位として扱うだけの場合は、そのように保存してもかまいません。

ただし、リストを常に1つの単位として扱い、不正行為を行わず、1つの単位であると言ってから、別の場所にばらばらにすることをお勧めします。DBMSにそれを行わせる方がよいでしょう。

パフォーマンスに問題がある場合にのみ、速度を非正規化してから、常に最初に3NFを実行する必要があります。

あなたが質問で話しているそれらの分野は、あなたがユニットとして扱うような種類のものではありません。リスト内の個々の要素に対して何かを行う必要があるため、それらを別のテーブルに分割する必要があります。

于 2009-10-29T03:20:06.037 に答える