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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

6040閲覧

DB設計(勤怠管理)について

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2020/06/17 06:34

前提・実現したいこと

RecoRuのような勤怠管理Webアプリを作成したいのですが、DB設計について悩んでいます。
現在は社員テーブルと勤怠テーブルがあり、それぞれ以下のような構造になっています。

社員テーブル 勤怠テーブル
id id
name user_id
. 日にち(yyyyMMdd)
. 出勤時間
. 退勤時間
. 休憩時間
. 出勤区分

この状態で勤怠表を打刻し、DBに登録するとuser_idと日にち毎にデータが挿入されるため、1年間で365件×従業員数のレコードが登録されることになります。これでは検索が大変になるのではと思いテーブルを分けようと思ったのですが、どのように分ければよいかご助力願えたらと思います。
自分が考えたDB構造としては以下のようなものがあります。

社員テーブル 出勤時間テーブル 退勤時間テーブル 休憩時間テーブル 出勤区分テーブル
id id id id id
name user_id user_id user_id user_id
. date_id date_id date_id date_id
. 出勤時間 退勤時間 休憩時間 出勤区分

それとも勤怠表は月ごとに切り替わるため、月ごとにわけるほうがよいのでしょうか?その際どのような設計にするのが望ましいでしょうか?(月の中間テーブルを作成?)

補足情報(FW/ツールのバージョンなど)

java
SpringBoot
PostgreSQL

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/17 06:50

> これでは検索が大変になる そのためのデータベースソフトウェアですよ? 高度な集計もクエリーひとつでサクッと解決するんですけど。
退会済みユーザー

退会済みユーザー

2020/06/17 06:57

すみません。検索が大変になるというより、値を取得する際にテーブルを分けたほうが処理が速いかな?と思ってのことだったんですが、変わらないですかね?
退会済みユーザー

退会済みユーザー

2020/06/17 06:58

インデックスを適切に設定したり、回答にも書きましたがパーティショニングやビューなど、方法はいくらでもあります。
dodox86

2020/06/17 06:58

> 1年間で365件×従業員数のレコードが登録されることになります。これでは検索が大変になる そんなに心配なのであればテスト用のデータ数千でも数十万でも作ってブチ込んで試してみてはいかがでしょう。多分件数自体は問題にならないと思います。あと気になるのは、今のご質問内容では業務案件の相談、コンサルティング依頼です。
退会済みユーザー

退会済みユーザー

2020/06/17 08:51

テーブル構成は、マークダウンのテーブルレイアウトで作成しましょう
guest

回答2

0

ベストアンサー

個人的な意見ですが、出勤区分は良いとして、出勤・退勤・休憩については、識別した区分を持つ一つのテーブルにすると思います。

出勤・退勤・休憩の何れにせよ時間だけは絶対ですのでそれらは時系列に並ぶはずです。
識別を補正するにしてもテーブルの移動はせずに済みますので、一つのテーブルになっていた方が確認もし易そうです。

date_idが何なのかは分かりませんけども、勤怠であれば締めのコード(そのコードを日付の範囲で変換できるテーブルを別に持つ)を持っていた方が良いかと思います。

データ量については、postgresならパーティション分割できますので、後から考えても良いかと思います。

投稿2020/06/17 06:57

編集2020/06/17 07:03
sazi

総合スコア25197

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

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

0

勤怠管理システムのおおよそとして、
・リアルタイムな日々の記録テーブル
・集計単位(週/月/年)ごとの確定データを集約したテーブル
の2段構えというのは全然アリだと思います。

日々の記録を一つのテーブルに溜め込んで、10年後20年後のレコード数も概算できると思いますが、
例えば、5.11. テーブルのパーティショニングを活用することでパフォーマンス改善したりもできますし、
古典的には
日々のデータを記録するテーブルを年単位で作っておき、
検索用に年単位のデータを串刺しで検索できるようにビューを組む、
などとすることで記録性や応答性を犠牲にせずデータの肥大化にも対応できるかと。

応答の遅いクエリーを改善するのに14.1. EXPLAINの利用によってボトルネックをあぶり出し、
インデックスの最適化を行ったりパーティショニングしたりすればいいです。

24.1. 定常的なバキューム作業も駆使してパフォーマンスが落ちないようにするのも忘れずに。

投稿2020/06/17 06:57

編集2020/06/17 07:02
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問