記事に対するランキングを集計するSQL文を記述しようと思います。
categoryには「すべて」「スポース」「趣味」「ビジネス」「金融」
等があり、記事ごとに、一つのカテゴリに属します。
ただし、ランキングを算出する場合は次のカラムにランキングの結果を入れるような設計で考えております。
「所属カテゴリ」のランキング => ranking 「すべて」のカテゴリのランキング => ranking_all
また、ランキングは3時間毎に集計し
created_atには"2016/08/06 11:00"
といった値が入ります。
今回、rankingとranking_allにランキング結果を集計したいため、
同じレコードに2回アクセスすることになります。
そのため、DUPLICATE KEY UPDATE
を使いレコードが存在すれば更新するというSQL文にしようと思ってます。
その際に、
uniq制約の設計をしなくてはいけないのですが、
現状は、article_idとcreated_at でしか、uniqかどうかの判断ができません。
ランキングのため、created_atのような時間軸のカラムは必須だと思っております。
質問
そこで質問したい点は
このような状況下の中、uniq制約をかけるindexはarticle_idとcreated_atでよろしいでしょうか?
created_atのようなdatetimeをindexの対象にしてしまうことは、後々問題になったりしないかなと心配です。
テーブル設計やカラムを追加した方がいい等、ありましたら、ご指摘頂けますと幸いです。
宜しくお願いします。
------------------------------------------------------------------------------+ | Table | Create Table | ------------------------------------------------------------------------------+ | rankings | CREATE TABLE `rankings` ( `article_id` char(255) NOT NULL, `category_id` int(11) NOT NULL, `ranking` int(11) DEFAULT NULL, # 「所属カテゴリ」のランキングがこのカラムに入る `ranking_all` int(11) DEFAULT NULL, # 「すべて」のカテゴリのランキングがこのカラムに入る `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ------------------------------------------------------------------------------+
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。