2016-04-06 11 views
0

オブジェクトが好きな場所でデータベーススキーマをセットアップしようとしています。 多くの場合、任意のオブジェクトの好きな数の合計にアクセスする必要があります。リレーショナルデータベースで「好きな数」を実装する方法

Iセットアップ二つのテーブル:新しい行が好きに挿入されるたびにインクリメントされます

[OBJECT] 
id 
path 
desc 

[LIKES] 
obj_id 
user_id 
timestamp 

それは、フィールド「nr_of_likes」オブジェクト表のを実装するために私にローミングサービスになるだろう、表。 これは、オブジェクトあたりの好きな数の数よりもはるかに速くなければなりません。 問題は、私が冗長なデータを取得し、通常、私が勉強したものから、それは良くないことです。 この種の問題に関するベストプラクティスは何ですか? 「nr_of_likes」フィールドは実装できますか? あなたの意見をお寄せいただきありがとうございます!

+0

パフォーマンス上の理由から非常に頻繁に使用される非正規化またはメモ化 –

+0

'COUNT()'を得るのではなく、テーブルに好きな数の合計を含む列を追加するのは理想的ではありません。読むのが速いかもしれませんが、番号が変わるたびに常にその列を維持しなければならないことを考慮する必要があります。さらに、あなたはそれを好きな人のすべての概念を失います。冗長データは必ずしも悪いとは限りませんが、この場合重複していると考えているのは何ですか? – Siyual

答えて

1

あなたが提案したようにカラムを実装することは可能です。あなたが見つけたように、それは通常悪い習慣です。 Likesテーブルで適切なインデックスを作成している場合は、通常はパフォーマンスが向上します。もちろん、それはあなたのデータベースがどれくらいの大きさで、それがどのタイプのシステムであるかによって異なります。データベース設計の「一般的な」規則に違反するかどうかを

は、非正規化の他の並べ替えのためだけの意思決定のようなものです - 理由は何ですか?そのデザインの選択にはどのようなコストがかかりますか?彼らはプラスよりも重要ですか?

私自身のアプローチは、常に標準的なデータベース設計ルールに従うことです。 TESTパフォーマンスの問題があると判断する前に、パフォーマンスを確認してください。パフォーマンスの問題が見つかった場合は、下位のデータベース設計を使用せずに、その問題を解決する方法(索引付けなど)を見てください。最後の手段として非正規化する。これはツールベルトのツールです。残念なことに、これは、必要以上に頻繁に使用されています。

いつもがデザインの決定には不利な点を理解していることを必ず確認してください。

関連する問題