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

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

新規登録して質問してみよう
ただいま回答率
85.50%
データベース

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

データベース設計

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

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

Q&A

解決済

2回答

1766閲覧

DB論理設計:上期と下期で製品の名前が変わる

Kaiser

総合スコア295

データベース

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

データベース設計

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

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

0グッド

2クリップ

投稿2019/01/12 02:44

DB論理設計:上期と下期で製品の名前がDB

DBの論理設計で理想的な設計について、質問させていただきます。
トランザクションテーブルの製品コードを利用し、製品マスタから製品名を取得する方法です。
製品名は、製造日により、上期(4月から9月)と下期で違う名称になります。
現在のテーブル構成をご連絡します。

■トランザクションテーブル
製造日、製品コード

■製品名称マスタ(上期)
製品コード、製品名称

■製品名称マスタ(下期)
製品コード、製品名称

発生している問題

製造日により、毎回上期下期のテーブルをプログラム側で読み分ける必要があり
プログラムが煩雑となっております。
また、上期と下期よりテーブル分ける行為自体もDB設計上アンチパターンだと考えています。

考えた案

いくつか案を考えたので、賛同、否定、別の案があればご教示いただきたいです。

①現行通り

 コードでなんとかする。という案です。

 メリット:無いと思うのですが。。。
デメリット:コードが煩雑となり保守性が低下する。
②製品名称マスタ側に適用開始日と適用終了日の列を追加

 下記構成にして、トランザクションテーブルと関連付けられるようにする
■製品名称マスタ
製品コード、適用開始製造日、適用開始終了日、製品名称

 メリット:コードは取ってきた名称を取得するだけ
デメリット:上期と下期という分け方が、製品名称マスタ上表現できていない。
Join条件が複雑となる。

③製品名称マスタに上期or下期の列を追加し関連付ける

 下記構成にして、トランザクションテーブルと関連付けられるようにする
■製品名称マスタ
製品コード、上期or下期、製品名称
■トランザクションテーブル
製造日、製品コード、上期or下期

 メリット:コードは取ってきた名称を取得するだけ。Joinは簡単。
デメリット:トランザクションテーブル側が若干冗長化(製造日と期が被る)する。
④上期と下期と製造日を関連付けるマスタを追加(投稿者推し)

 下記構成にして、トランザクションテーブルと関連付けられるようにする
■製品名称マスタ
製品コード、上期or下期、製品名称
■トランザクションテーブル
製造日、製品コード
■上期、下期判断マスタ
日付、上期 or 下期

 メリット:コードは取ってきた名称を取得するだけ。
いつからがいつまでが上期なのかが分かりやすくなる。
他の機能で上期下期で分けたいときに再利用できる。

 デメリット:名称までたどり着くまでに、Joinが一つ増える。
パフォーマンスが悪くなる。
※パフォーマンスは、判断マスタが365件のテーブルなので影響は無いと考える。
Joinの複雑さはViewで回避できるかなと思います。


以上長くなってしまいました。
案に対する、賛同、否定、別の案があればご教示お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

商品マスタ等のマスタは普通過去分まで持つと思いますので通期(年+期)で、不要ならで。
※期の値自体は、0,1でも別に構わないですが。

ポイントはマスターの正規化です。
そうすると自ずと外部参照側も適正なものになります。

■製品名称マスタ

通期製品コード名称
201804A-0001商品A
201809A-0001商品A

■トランザクションテーブル

製造日通期製品コード
20180510201804A-0001
20181020201809A-0001

トランザクションテーブルの期は参照時に製造日から変換するのではなく、更新時に行うようにすると、素のインデックスが使用できます。
というか、外部参照なら当たり前の事ですけど。

なので、③ですね。

期の判別を他のテーブルに持たせるのはありですけど、それはあくまで変換の目的として
経由するようには考えない方が良いかと思います。

投稿2019/01/12 03:56

編集2019/01/12 05:09
sazi

総合スコア25138

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

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

Kaiser

2019/01/12 05:08

ご回答ありがとうございます。 私も、期に意味があるのであれば別の列を追加したいと考えています。 今は、計上日の頭6桁を使っています。。。(愚痴) いずれにせよ、判断マスタはやりすぎ。多少意味が重複しても別の用途であれば 列を追加することは悪くない。と理解します。  ※当然、容量等の問題は考慮する。
sazi

2019/01/12 05:33 編集

回答に追記しました。 判断のマスタについて、会計などで通算期で管理するような場合は変換用のテーブルを使用したりもしますが、上期/下期程度なら不要でしょう。(期の分け方が一定でないなら別ですけど) 使用するとしても変換目的にとどめ、リレーション上で経由するようにしない方が効率的です。
Kaiser

2019/01/12 05:36

ご回答ありがとうございます。 参考にさせていただきます。
guest

0

上期 or 下期かの判断は製造日から計算で割り出せるので、
別に■上期、下期判断マスタを用意しなくても、CASE文の結果とJOIN出来るかなと思います。
計算した結果でJOINするのでパフォーマンスは遅いかもしれませんが。

sql

1 2CASE 3  WHEN MONTH(製造日)>=4 AND MONTH(製造日)<=9 THEN '上期' 4 ELSE '下期' 5END 6AS7

あと、上期or下期と2ケースしかないのであれば
■製品名称マスタ
製品コード、製品名称(上期)、製品名称(下期)
として、トランザクションテーブルとJOINした後に、
製造日から、上期か下期かどちらか判断して出力するというのもあるかと思います。

投稿2019/01/12 03:35

cobm

総合スコア239

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

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

Kaiser

2019/01/12 05:13

ご回答ありがとうございます。 CASE文という発想はありませんでした。 実は、現行の参照時の画面表示時は、JOINした後に製造日から判断しています。 上期、下期二つのテーブルをJOINしています。 回答を頂きながら申し訳ないのですが、 可能な限りロジックのようなものは、コードに記述して、SQL上ではロジックチックなことは 避けるべきだと、考えています。 とはいえ、自分でテーブル設計ができない状況等あるので、その際はCASE文も 積極的に活用したいと考えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問