新しいプロジェクトについて考え始めたところ、速度の問題がいくつか見つかりました。それをコーディングするための適切でエレガントな方法を選択するのを手伝ってくれることを願っています.
各ユーザーは、訪れた「場所」のデータベース レコードを持っています。各場所には「学校」があります。この特定の場所にある多くの学校です。各学校にはクラスがあります。各クラスは異なる時期に「学習年」を終了する可能性があるため、日付が学習年の終わり >= である場合、数字は増加する必要があります。
したがって、次のようなデータベースがあります。
「場所」テーブル:
place | user_id |
-----------------
1 | 4 |
2 | 4 |
ユーザー番号 4 は場所番号 1 と 2 を訪れました
「学校」テーブル:
school | place |
----------------
5 | 2 |
6 | 2 |
Place 2 には 2 つの学校があり、id は 5 と 6 です。
「クラス」テーブル:
class | school | end_learning | class_number
---------------------------------------------
20 | 5 | 01.01.2013 | 2
21 | 5 | 03.01.2013 | 3
22 | 5 | 05.01.2013 | 4
学校 5 には、ID が 20、21、22 の 3 つのクラスがあります。日付が 2013 年 1 月 1 日より大きい場合、クラス 20 のクラス番号を 3 に増やし、学習終了日を 2014 年 1 月 1 日に変更する必要があります。等々。
ここで、問題に取り掛かりました。1000 の場所があり、それぞれに 100 の学校があり、それぞれに 10 のクラスがある場合、1000000 のレコードが得られます。それは多い。私が提示したのは単純な例にすぎないため、ユーザーがページを更新するたびにデータベース全体を更新することを検討する必要があるため、その量のレコードで遅延が発生する可能性がある.
クラスを school テーブルの 1 つのフィールドにシリアル化することもできます。
school | place | classes
-------------------------------------------------------------------------
5 | 2 | serialized class 20, 21, 22 with end_learning field and class number
6 | 2 | other serialized classes from school 6
その場合、取得するレコードは 10 分の 1 になりますが、データを逆シリアル化し、日付を確認し、現在よりも少ない場合はシリアル化し、データベースに保存する必要があります。2 番目の問題は、すべてのレコードを変更する必要があるだけでなく、データベースからすべてのレコードを選択して操作する必要があることです。
また、2 つのデータベースを用意することも考えています。1 つは将来変更が必要になる可能性のあるレコード、もう 1 つは今後 24 時間以内 (近い将来) に変更が必要になる可能性があるレコードです。24 時間ごとに、次の 24 時間で学習を終了するすべてのクラスが「近い将来」のデータベースに移動されるため、ページを更新するたびに、数十万や数百万ではなく、数千のレコードが処理されます。その代わりに、1 日に 1 回だけ「近い将来」のテーブルを作成するために、何百万ものレコード (さらに将来) を処理します。
これらすべてのデータベース スキーマについてどう思いますか? 多分あなたはより良い考えを持っていますか?