2017-07-12 5 views
1

たとえば、user、postなどのテーブルがあり、好きな人を表すuser_idとpost_idの外部キーがあるとします。投稿のlike_countカラムを持っている方がいいですか?同様のテーブルのtriggerコマンドで更新するか、like countを問い合わせるたびにjoinコマンドを使いますか?countカラムを持つことは良い設計ですか、毎回joinコマンドを使用する方が良いですか?

私は最初にjoinコマンドを使用するほうが良いと思っていましたが、それをしばらく使用した後は、like_countを使用する方が良いと思うようになりました。時々私は実際の状況で多くのテーブルに参加する必要があり、count_postカラムを持つよりも、特定の投稿のような数だけ取得するための追加のjoinコマンドを使用する方が悪い考えです。私に助言してください。

*私は類似のディスカッションを検索するために検索しましたが、失敗しました。この質問を投稿します。これが複製されている場合は、教えてください。

+0

カウントクエリを実行する頻度はどのくらいですか?非常にまれに行う予定がある場合は、おそらくトリガーアプローチを使用すると無駄になります。一方、カウントクエリを頻繁に行う予定がある場合は、トリガで1回カウントを更新してから、追加コストなしで何度も読み込む方が経済的かもしれません。 –

+0

良い点。私はアプリケーションがwrite_countカラムを作成するように書く以上のものを読んでくれることを期待しています。ありがとう! –

答えて

0

あなたは次の2つのクエリの違いについて尋ねている:

SELECT post_id, COUNT(user_id) 
FROM like 
GROUP BY post_id; 

SELECT post_id, like_count 
FROM post; 

をあなたはlike_count行がlikeテーブルに作成されるたびにインクリメントされていると仮定します。

また、likeテーブルだけに対してGROUP BYを実行することで、カウントを取得するために参加する必要はありません。

集計(カウントなど)を計算して保存するのは、一般的な形式の非正規化です。

厳密に言えば、これは冗長な情報であり、データの異常が発生する可能性があります。 like_countを更新するためにコードが失敗することがあり、不正確になる可能性があります。

このリスクを受け入れる場合は、カウントを行うたびに集約クエリを実行しないでください。

関連する問題