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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

3179閲覧

MySQLに対し、過去のデータを保存するにはどうすれば…

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

1グッド

0クリップ

投稿2016/05/16 04:50

編集2016/05/19 04:35

現在、休暇管理表を作っていますが、MySQLのデータベース構造について悩んでいます。
12日間の勤怠状況のレコードを作り、PHPからインプットした勤怠データを直接データベースに保存するやり方をしています。

今の状態では勤怠データを上書きしかすることができません。過去のデータをどう保存し、管理するかを悩んでいます。以下が私なりに考えたER図です。

ER図

【ER図の説明】
テーブル別
users_info: ユーザー情報。user_idがメールアドレスとして想定しています。

days_record: days_recordテーブルのカラムには日付を入れるつもりでいます。(例:05月16日(月)

attendance_record: 休日、出勤、有給休暇と項目準備し、これをattendance_recordテーブルのカラムには勤怠状況を入れるつもりでいます。整数型にしてる理由は、文字列型を入れるのは非効率的だあり、容量もとるからです。最初から決まった項目ならば、休日、出勤、有給休暇それぞれに1,2,3と条件で数字を割り当てる方法が効率的だと判断したからです。

以上を踏まえて質問…
MySQLで過去のデータをも保存できるテーブルの構成がわかる方、ご教授ください。
経験豊富な方であれば、以上のER図を見て、結構カオスな状況に見えるかと思います。
ぶっちゃけ根本的に指摘してもかまいませんので、考えがある方、お願いします。

act823👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

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レコード作る感じです。

投稿2016/05/16 05:37

ttyp03

総合スコア16996

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

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

退会済みユーザー

退会済みユーザー

2016/05/16 05:51 編集

ご回答ありがとうございます。 > 廃止(日付を日本語で保持する意味がわかりません) PHP側で日付を指定してMySQLに保存させるためです。 (GW、お盆、年末年始)若干日付変わったりするため、直接PHPの方で設定し、MySQLに保存する仕様です。 質問… カラム?statusはリンクするためだけにあるんですか? statusの存在がいまいち理解できませんでした。
ttyp03

2016/05/16 06:01

日付の仕様がよくわかりませんが、日付を日本語に表記にするだけであれば、attendance_recordテーブルにあるdate型の日付から変換すればよいだけですので、不要かと思いました。 通常の日付とは別の管理(例えば5/16なのに5/17として扱いたいとか)が必要であるなら残しておく必要はありますね。 その場合、days_recordテーブルには、attendance_recordとリンクするためのdate型のカラムが必要になり、day01~12は不要になります。 days_recordテーブル ・user_id ・date … DATE型のカラム ・date_word … 表示用の文字列 statusはそれを管理するマスターをstatus_masterとして追加しました。 このテーブルのレコード構成は、例えば、 status, word 1, 休日 2, 出勤 3, 有給休暇 … になります。 勤怠状況の値をマスターとして管理することで、ステータスの追加や変更を容易にします。 これはデータベースの基本的な考え方のひとつと言えるでしょう。
退会済みユーザー

退会済みユーザー

2016/05/16 08:07

days_recordテーブルのカラム数は3つだけでよいということですか?
ttyp03

2016/05/16 08:28

カラム数は3つで良いと思います。 しかし、どうしてもdays_recordテーブルが必要なのでしょうか?
退会済みユーザー

退会済みユーザー

2016/05/16 09:26

>しかし、どうしてもdays_recordテーブルが必要なのでしょうか? htmlやphp側で指定した日付を保存したいので、必要なのではないかと判断しました。 もしかして、他に方法があるんですか?
ttyp03

2016/05/16 10:25

> もしかして、他に方法があるんですか? それが最初に提示した回答です。
退会済みユーザー

退会済みユーザー

2016/05/16 14:43

わかりました。 …まだいまいちピンときませんが、上記の考えの通りやってみます!
退会済みユーザー

退会済みユーザー

2016/05/20 06:03

なんとか解決した…かもです! 最後に質問ですが、テーブル一つにつきprimary keyがないといけないでしょうか?
ttyp03

2016/05/20 06:09

解決されたようで良かったです。 プライマリーキーについては必ず必要というわけでないです。 ユニークにしたいカラムに対してつければよいです。 今回の例ですとuser_idは重複するわけにはいかないのでキーにする必要があります。
guest

0

days_recordとattendance_recordの日付をDate型にするだけでも良いかと思います。

投稿2016/05/16 05:08

A-pZ

総合スコア12011

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

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

退会済みユーザー

退会済みユーザー

2016/05/16 05:35

なるほど、Data型あったんですね!これは便利かもです。 しかし、、、 日付をDate型にするとはどいうことですか? いまいち理解できませんでした。
A-pZ

2016/05/16 05:40

日付型にすることで「表示するときには現在から12日間で検索したものを抽出する」ことが可能になり、過去日もそのままで使えます。
退会済みユーザー

退会済みユーザー

2016/05/16 05:59

なるほど!便利ですね!Date型について詳しく調べてみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問