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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

504閲覧

SQL(データベース) リレーションスキーマの正規化が上手くいかない

hatomugi_tarou

総合スコア15

PostgreSQL

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2019/11/25 15:08

編集2019/11/26 13:01

前提・実現したいこと

SQL(データベース)を使ったプログラムを作成したのですが、
完成後にリレーションスキーマを正規化させようとすると、
完成したものと違ったものになり、しかし、その違った形だと
管理上むずかしくなるので、どういった条件で自分がリレーションスキーマを作ったのかが
知りたい。

初期スキーマ

A(従業員番号、氏名、部門番号、部門名、パスワード、労働時間番号、出勤時間、退勤時間)
※太字が主キー

作成したプログラムのスキーマ

A(従業員番号、氏名、部門番号、パスワード)
B(部門番号、部門名)
C(労働時間番号、従業員番号、出勤時間、退勤時間)

条件

従業員番号 同じ番号が複数存在しない。
氏名 氏名と部門番号の両方が同じ従業員存在しない。
部門番号 部門番号が同じである従業員は部門名も同じとなる。
パスワード 同じパスワードが複数存在することもある。
労働時間番号 同じ番号が複数存在しない。
出勤時間 同じ時間の従業員が複数存在することもある。
退勤時間 同じ時間の従業員が複数存在することもある。

条件通りにした場合

A(従業員番号、氏名、部門番号、部門名、労働時間番号)
B(部門番号、部門名)
C(労働時間番号、出勤時間)
D(労働時間番号、退勤時間)

プログラムについて

労働時間を管理するタイムレコーダーを作成したかった。
識別や、削除や更新コマンドをするために、労働時間番号が必要。
作成したプログラムのスキーマにおいて、AとCは従業員番号で結合させているので、従業員番号はどちらにも必要だが、どうにも分解したら出勤時間・退勤時間と従業員番号が一緒になりません。

環境

Ubuntu, PostgreSQL

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

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

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

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

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

Orlofsky

2019/11/25 15:35

データベースはタグで提示してください。
guest

回答2

0

ベストアンサー

リレーションスキーマを正規化させようとすると

ツールか何かで行われているんですよね?

良く分かりませんが、「労働時間番号」というサロゲートキーを使われているからではないでしょうか?

ナチュラルキーで構成するか
C(従業員番号出勤時間、退勤時間)

労働時間番号を従業員番号に従属させるようにしてみてはどうでしょうか。
C(従業員番号労働時間番号、出勤時間、退勤時間)

投稿2019/11/26 12:54

sazi

総合スコア25138

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

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

hatomugi_tarou

2019/11/26 13:06

PHPでWebインターフェイスを作った際に、労働時間番号があると楽だなと追加した結果、ぐだぐだになった感じです…。 正しい順番で設計するべきだと痛感しました。 後者の条件を採用させていただきます!ありがとうございます!
guest

0

従業員マスタ : 従業員番号、氏名、部門番号 (PRIMARY KEY 従業員番号)
部門マスタ : 部門番号、部門名 (PRIMARY KEY 部門番号)
出退勤テーブル : 従業員番号、出勤日時、退勤日時 (PRIMARY KEY 従業員番号、出勤日時)

でいかが?

投稿2019/11/25 15:22

Orlofsky

総合スコア16415

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

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

hatomugi_tarou

2019/11/25 15:39

ご回答ありがとうございます。 1つ質問なのですが、部門番号→部門名の関数従属性があって部門マスタのように分解するのは分かるのですが、そう言った場合、新しく作成したリレーションは2つのスキーマしかできないように思えます...。どういった条件で、出退勤テーブルのような3つ以上のスキーマを持つリレーションができるのでしょうか。
Orlofsky

2019/11/25 16:12 編集

スキーマってどういう意味で使っていますか? 総務部、営業部、経理部、システム部、人事部、etc. の部門があって、それぞれ社員はどれかの部門に属します。日々の出退勤以外に、部門が追加されたり削除されたり、名称が変更されたり、社員は人事異動で部門が変わったりといろいろなデータを修正する必要もあります。 2019年11月の部門毎の勤務時間、部門社員毎の勤務時間を求める SELECT文はどうやって書いたら良いか、そのためにはどんなテーブル設計が必要か、などテーブル設計にはいろいろなスキルが必要です。ある程度はSQLも書けないときちんとした設計はできません。正規化は通常第3正規化まで行います。 DB論理設計の手順とチェックポイントまとめ https://qiita.com/nishina555/items/a79ece1b54faf7240fac
hatomugi_tarou

2019/11/26 13:03

申し訳ありません、用語の意味を確認しておきます。 詳しくありがとうございました!
Orlofsky

2019/11/26 13:14

テーブル設計の基本に同じ情報をあちこちに持たない、って掟があります。 >部門が追加されたり削除されたり、名称が変更されたり、社員は人事異動で部門が変わったり ... SELECT ... FROM 部門マスタ INNER JOIN 従業員マスタ ON 部門マスタ.部門番号 = 従業員マスタ.部門番号 ... この程度のSQLを理解できるとして、 部門マスタと従業員マスタの両方に部門名を持つと、部門マスタの部門名だけでなく、同じ部門に属する従業員マスタの部門名も全部修正しなければなりませんが、修正漏れが起きやすくなることに気が付けると一歩前進です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問