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

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

ただいまの
回答率

90.48%

  • MySQL

    6038questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 753
退会済みユーザー

退会済みユーザー

現在、休暇管理表を作っていますが、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図を見て、結構カオスな状況に見えるかと思います。
ぶっちゃけ根本的に指摘してもかまいませんので、考えがある方、お願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

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 14:51 編集

    ご回答ありがとうございます。
    > 廃止(日付を日本語で保持する意味がわかりません)
    PHP側で日付を指定してMySQLに保存させるためです。
    (GW、お盆、年末年始)若干日付変わったりするため、直接PHPの方で設定し、MySQLに保存する仕様です。

    質問…
    カラム?statusはリンクするためだけにあるんですか?
    statusの存在がいまいち理解できませんでした。

    キャンセル

  • 2016/05/16 15: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 17:07

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

    キャンセル

  • 2016/05/16 17:28

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

    キャンセル

  • 2016/05/16 18:26

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

    キャンセル

  • 2016/05/16 19:25

    > もしかして、他に方法があるんですか?
    それが最初に提示した回答です。

    キャンセル

  • 2016/05/16 23:43

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

    キャンセル

  • 2016/05/20 15:03

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

    キャンセル

  • 2016/05/20 15:09

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/16 14:35

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

    キャンセル

  • 2016/05/16 14:40

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

    キャンセル

  • 2016/05/16 14:59

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

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Mysql カラムを追加する方法

    Mysqlでテーブルを作ったのは良いものの、必要なカラムをいれるのを忘れていました。 カラムを新しく作ったテーブルに追加するにはどうすれば良いでしょうか? どなたか教えていただけま

  • 解決済

    MySQLに営業時間を登録する

    飲食店情報サイトシステムを構築しております。 使用DBはMySQLです。 お店ごとに異なる「営業時間」の項目を格納するのに最適な型について、 いい案がありましたらご教授お願い致し

  • 解決済

    MySQLなどのDBで2次元配列のデータを管理したい

    プログラム内で生成する2次元配列 をBDで管理したいと考えています。 たとえば、プログラムを実行すると2次元配列内にint型データが書き込まれていきます。 書き込むたびにDBへバ

  • 解決済

    mysqlで特定のカラムだけ除いてselect結果を出力

    mysqlで特定のカラムだけ除いてselect結果を出力したいのですが、どのようにクエリを書けばよいでしょうか? カラムが15あって14カラムのみ出力したい場合、select c

  • 解決済

    MYSQLのCASE分

    select case~~~の部分にelseを書くと思いますが、 elseを取得しない方法はないですか?? 10000件があって caseで金、銀、銅に振り分けて、それ以外は表示

  • 解決済

    sql文エラーにつきまして

    前提・実現したいこと いただいた回答をもとに再度実行したのですがなかなかうまくいきません。 実行したsql全文添付します。 DROP TABLE IF EXISTS me

  • 解決済

    古いmysqldumpでダンプしたSQLファイルをMySQL5.7.18でimportしたい

    わからない事、知りたいこと 古いmysqldumpでダンプしたSQLファイルをMYSQL5.7.18でimportすると次のようなエラーになる。 ERROR 1118 (420

  • 解決済

    MySQLで、VARCHAR型のカラムとintを=で比較した場合、=が自動でlikeになっている?

    MySQLの=の仕様がわからず、悩んでいます。 SELECT * FROM テーブル WHERE VARCHAR型のカラム = '2'; これだと、VARCHAR型のカラムが2

同じタグがついた質問を見る

  • MySQL

    6038questions

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