質問: 現在、休暇管理表を作っていますが、MySQLのデータベース構造について悩んでいます。 12日間の勤怠状況のレコードを作り、PHPからインプットした勤怠データを直接データベースに保存するやり方をしています。 今の状態では勤怠データを上書きしかすることができません。**過去のデータ**をどう保存し、管理するかを悩んでいます。以下が私なりに考えたER図です。 ![ER図](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/c2f912142b72cbda236c33b7c0463a45.png) 【ER図の説明】 テーブル別 users_info: ユーザー情報。user_idがメールアドレスとして想定しています。 days_record: days_recordテーブルのカラムには日付を入れるつもりでいます。(例:05月16日(月) attendance_record: 休日、出勤、有給休暇と項目準備し、これをattendance_recordテーブルのカラムには勤怠状況を入れるつもりでいます。整数型にしてる理由は、文字列型を入れるのは非効率的だあり、容量もとるからです。最初から決まった項目ならば、休日、出勤、有給休暇それぞれに1,2,3と条件で数字を割り当てる方法が効率的だと判断したからです。 以上を踏まえて質問... **MySQLで過去のデータをも保存できるテーブルの構成**がわかる方、ご教授ください。 経験豊富な方であれば、以上のER図を見て、結構カオスな状況に見えるかと思います。 ぶっちゃけ根本的に指摘してもかまいませんので、考えがある方、お願いします。
回答: 12日間というのは直近で12日間ということでしょうか。 そこらへんの意図がわからなかったのですが、単純に過去のデータも保存したいということであれば、次のようなテーブル構成で良いかなと思います。 **users_infoテーブル** 現状維持 **days_recordテーブル** 廃止(日付を日本語で保持する意味がわかりません) **attendance_recordテーブル** user_id ... users_infoとリンク date ... 日付 status ... 勤怠状況 status_master にリンク **status_masterテーブル** status ... 勤怠状況 attendance_record とリンク word ... 日本語名(休日、出勤、有給休暇) つまり1ユーザー、1日付ごとに1レコード作る感じです。