私は 24 時間の週単位のスケジュールを保存しています。つまり、各人は 24x7 の 2D 配列 ( availability[time][day]
) を持ち、1 人あたり合計 168 要素になります。ユーザーによる検索では、可用性はフィルターです。つまり、これらの要素をテーブル ( availabilities
) に格納する必要があります。
のスキーマの一部availabilities
:
+---------+----------------+
| Field | Type |
+---------+----------------+
| user_id | int(10) |
| time | varchar(4) |
| mon | tinyint(1) |
| tue | tinyint(1) |
| wed | tinyint(1) |
| thu | tinyint(1) |
| fri | tinyint(1) |
| sat | tinyint(1) |
| sun | tinyint(1) |
+---------+----------------+
選択の例 (各ユーザーは、実際には 1 日で 24 行になります):
+---------+------+-----+-----+-----+-----+-----+-----+-----+
| user_id | time | mon | tue | wed | thu | fri | sat | sun |
+---------+------+-----+-----+-----+-----+-----+-----+-----+
| 1 | 6am | 1 | 0 | 1 | 1 | 1 | 0 | 0 |
| 1 | 7am | 1 | 0 | 1 | 1 | 1 | 0 | 0 |
| 1 | 8am | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
| 1 | 9am | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
| 1 | 10am | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
| 1 | 11am | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
| 1 | 12pm | 1 | 0 | 1 | 1 | 1 | 0 | 1 |
+---------+------+-----+-----+-----+-----+-----+-----+-----+
私の懸念は、このテーブルが大規模になり、結合して解析すると非常に遅くなることです。可用性フィルターは最後に適用されますが、返される可能性のあるユーザーのセットは依然として大きい可能性があります。
私の質問:
テーブルがそれほど大きくならないように、この情報を保存するより効果的な方法はありますか? 配列をシリアライズして users テーブルの 1 つのフィールドに保存すると (例:
users.availability
)、パフォーマンスが向上しますか? (より多くの解析がありますが、大規模な結合はスキップされます)テーブルのサイズは本当に問題ですか?これは初めての大規模なアプリケーションなので、このテーブルが実際に心配するほど大きいかどうかはわかりません。(たとえば、25 人のユーザーが返された場合、
availability
テーブルには 4,800 のフィールドが含まれます [を含まないuser_id
])