質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

3359閲覧

毎回計算するかデータベースに入れておくかの判断

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2018/05/13 06:31

編集2018/05/13 06:32

Djangoで質問投稿サイトを作っています。
teratailのように、質問投稿や回答投稿やそれらに対する評価に応じて、スコアやランキングが出るようにしたいと思っています。

しかし、そのスコアやランキングを表示する際に、その都度毎回計算すべきか、スコアやランキングを保存するデータベースを作るべきかと悩んでいます。
例えば、teratailでも、ユーザー毎にスコアやランキングが付いていますが、このスコアやランキングは、これまでの質問や回答の投稿数やその評価などによって算定されていると思います。
しかし、このスコアは、ユーザーがページにアクセスする都度、そのユーザーの投稿した質問数や回答数やそれらの評価をデータベースから検索して、スコアを集計しているのでしょうか。だとすると、サーバーの負荷が非常に高くなってしまうと思います。
そのため、例えば、質問を投稿した時、回答を投稿した時、評価された時に、スコアが集計されていく感じにしているのかなと想像しました。とすると、下記のようなテーブルがあって、上記のアクションがあった時にこのスコアが集計されるのかと思ったのですが、どうでしょうか。
ユーザーが2人しかいなくて、タグが2つしかないという想定です。

ユーザーIDタグIDスコア
1130
1224
2140
2210

質問する度、回答する度に、当該ユーザーの当該タグのためのフィールドがテーブルに追加されていく感じかなと思っております。
一般的にどのようにこのような仕組みを作り上げるのかを知りたく、質問させて頂きました。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

先ず、データベース設計における正規化で、第一正規化で導出項目(計算により求められる項目)は削除します。
当然計算により求められる項目について、計算に時間が掛かることは考えられますので、計算自体をどういったタイミングで行うのかも合わせたデータベース設計になってきます。

通常、時間の掛かる処理はデータ件数によるものが殆どで、時間を短縮するには、如何にその母数となる件数を減らすかに掛かっています。

例えば、必須条件を増やしたり、時系列的な範囲を狭めることを、仕様制限にしたり、
ある時点までの集計をとってそこからの範囲だけ集計を行うとか、要件を満たしつつ性能も担保するのには色々な方法があります。

最初から、アクセス数が大量と見込めるなら別ですけど、現段階では、計算によって求められる項目は作らず、そうなった時に検討で良いのではないでしょうか。

性能が問題になるような件数になった場合にはDISK資源の事も考えねばなりませんし、スケールアウトにも色々方法はあり、その構成に合わせた設計になりますので、検討はしても実装はせずというところでしょうか。

先ずは正規化して余分なものは削ぎ落してから、全体を見通した上で、拡張として考えるようにしてした方が上手くいくと思います。

投稿2018/05/13 12:33

編集2018/05/13 12:43
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/13 23:54

ご回答、ありがとうございます。 性能とDISK資源のトレードオフが生じるということですね。 処理速度を上げるために、母数となる件数を如何に減らすかという点が重要ということもよく分かりました。
guest

0

データの蓄積具合(の想定)によっても違うと思います。
少ないのでしたらDB取得のSELECT時にSUMしてもいいですし。
多いようでしたらtotal scoreテーブルか何かを作っておいて、
スコアの変動があるたびにUPDATEしておくというのもありと思います。
teratailのように個々の質問回答でどれくらいスコアしたかとか、
タグ毎のスコアも持つ必要があるのでしたらそれ毎にテーブルが必要ですね。

実際にどのように作られているかは作った人しか分からないので、
要件を整理してなるべく様々な形でのデータの持ち方を検証して
仕組みに合ったやり方を考えるしかないと思います。

投稿2018/05/13 08:59

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/13 23:55

ご回答、ありがとうございます。 後々拡張していくことにしますので、取り急ぎ、DB取得時に計算する方法で実装しておき、遅くなってきたら、また検討したいと思います。
m.ts10806

2018/05/14 01:43

ある程度データの蓄積については先に想定しておいた方がいいかもしれません。 後からDB分割したり変更するとなるとかなりのコストがかかり、既に動いているものへの大がかりな軌道修正となるので試験も大変です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問