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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

3回答

10328閲覧

アルバイト等のシフト管理システムのDB設計について

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

2クリップ

投稿2016/10/14 17:55

アルバイト等でシフトを作ったりすると思うのですが、そのようなシステムを作りたいと思ってます。
DB設計の段階で、どういうテーブルを持ち、どういうスキーマにするべきなのか悩んでいます。

シフトは1ヶ月ごとに出すと仮定します。途中で特定の日時の編集はできるようにします。

例えば10月15日にシフトを書き始めた場合、15日までの日時は全てnoneにするようにします。月末までにシフトを記述していれば、翌月1日からシフトを反映させます。15日に記述したシフトについては16日から月末までの記述を行い、16日よりシフトを反映させます。

要件としてはこのくらいです。

ここから実際にDBの設計を行いたいのですが、自分が考えた設計としては以下の通りです。

  • ユーザテーブル
  • シフトテーブル

ユーザとシフトは1:多の関係で作っておきます。
シフトは1ヶ月毎に1レコード作られるとします。
つまり一つのレコード、例えば10月のシフトレコードを作成し多場合、スキーマとして、シフトID、ユーザの外部キー、1日から月末までのバイト有無と時間が考えられると思います。
ですが、問題が2点ほどあります。

まず1つ目に、スキーマが多すぎること、一月の日数を1フィールととすると30以上ものフィールドが出来てしまいます。
2つ目に月の日数が確定していないこと。30日の月もあれば29日も31日もあります。また閏年なども考慮しなければなりません。

このような問題で悩まされているのですが、何か良い打開策はないでしょうか?
また、違う設計の場合はどいうものが考えられるでしょうか?

回答宜しくお願いします。

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

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

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

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

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

guest

回答3

0

こんにちは。
シフトテーブルのレコードを月単位にすると、ご質問に挙がっている

1つ目に、…
2つ目に…

といった問題が出てくるので、これらを解決する

違う設計

の案として、シフトのレコードを日単位にするのはいかがでしょうか?
すなわち、

  • ユーザーテーブルの主キー: ユーザーID

とするならば、

  • シフトテーブルの主キー: ユーザーID + 日付(例えばMySQL ならDATE型)

とします。

ER図を書くと、以下のような感じです。
イメージ説明
なお、各テーブルの、名前、入社日、出勤時刻、退勤時刻などは、たぶんこういうカラムがあるの
だろうという想定を書いています。

参考になれば幸いです。

投稿2016/10/14 20:39

jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2016/10/15 14:40

回答ありがとうございます! 確かに日毎に作成し、月単位でselectしデータを集計し多方が良さそうですね
jun68ykt

2016/10/16 01:51

はい。アルバイトのシフトのような勤怠管理システムですと、使う人(の部署)によって、一ヶ月(という期間)の開始日と終了日が違ってくる可能性があると思います。 たとえば、 (1) アルバイトを実際に使う現場のマネージャーにとっては、ある月の一ヶ月とは、当月の月初(1日)から末日までのことをいい、 (2) 経理部などアルバイトにお金を払う部門にとっては、ある月の一ヶ月とは、経理的な締め日を区切り(20日締めだったり、25日締めだったり等)とする一ヶ月間のことをいう。 というようなケースです。 アルバイトのシフト(勤怠)レコードを1日単位にしておけば、上記のような場合にも柔軟に対応できると思います。
guest

0

失礼ですが、学校の課題でしょうか?
課題の質問でももちろん良いのですが、具体性の無い問題には解答はありません。

ぱっと見て、データ設計にしては項目が少なすぎる気がします。

実際にシステムを作りたい人は、もう少し具体的に”これに困っていて、こう解決したいから、このようなことが出来るシステムを作りたい”と言う点から始まるので、”このような作業が存在し、このようなデータを使う”といったことが判ります。

データを整形するテクニックはいくつかありますが、ある程度目的に合わせないと意味がないことが多いです。

シフトを作るときの具体的な作業の洗い出しから始めてはいかがでしょうか?

投稿2016/10/15 01:16

iwamoto_takaaki

総合スコア2883

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

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

0

シフト管理が無料で使えるのもあります。
機能的に使えるか制限等で制約にならないか調べてみては?

投稿2016/10/14 23:42

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問