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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

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

データベース設計

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

Q&A

解決済

5回答

2042閲覧

DBの正規化をどこまで行うか

neoz

総合スコア31

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

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

データベース設計

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

0グッド

3クリップ

投稿2021/06/29 07:49

編集2021/06/30 06:39

データベース設計をしておりますが、正しい更新削除の方法・正規化の程度がわかりません。

商品マスタテーブルと、取引明細テーブルがあるとします。
1・2ではどちらが正しいでしょうか?

1:商品マスタは更新削除可能、取引明細テーブルには商品名カラムをもたせる
(マスタテーブルが更新削除された際に、取引明細テーブルで取引時の商品名を把握できるようにするため)
この場合、取引明細テーブルには、商品IDも持たせますか?

2:商品マスタは更新削除不可、取引明細テーブルには商品IDのみもたせる(全テーブルに渡って更新削除不可)
商品IDの指す商品名は不変で、変更があった場合は新規IDとなるため

個人的には正規化を正とするなら2が正しいと考えているのですが、いかがでしょうか?

(御礼)
皆様短期間に多くのご回答を下さり、大変ありがとうございました。
具体例を用いて、どちらのパターンも詳しく解説いただき、利用イメージがわいたのでtosiさんをベストアンサーにさせて頂きました。
同時に、唯一の解がない課題のため、皆様のご回答により多方向から考えることができ学びになりました。

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

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

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

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

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

guest

回答5

0

要件次第だけど、マスタの削除はフラグ管理してIDは使い回さない方が、後々データの結び付きを元にデータを抽出する際に便利だとは思う。

例えば質問文の1の状態だと、IDを使い回して過去の同名の商品と名前だけ一致してるケースなどはもう追跡不可なんで、明細にIDがあろうが無かろうが関連の保証にはならない。

変更や削除されたデータと明細の関連が完全に切れていいなら何でも構わないけど。

投稿2021/06/29 08:21

gentaro

総合スコア8949

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

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

0

ベストアンサー

1.の場合には、商品マスタはマスタと言うよりも、参照ファイルと言う意味になると思います。取引明細テーブル(ジャーナル)でシステムは完結されます。(ジャーナルは日々更新されるテーブルを指す)
取引明細テーブルへは商品IDも必要ないでしょう。(商品IDで検索したい場合には必要ですが・・・)つまり、入力画面から商品IDでマスタ値を呼び出し、全項目を取引明細TBへ書込む様な運用です。手入力で画面から取引明細TBへ全項目を入力したのと一緒ですね。
例えば、桜組みの園児マスタを考えると、園児は毎年変わるため削除もあります。その為、入力時に園児マスタ項目値を、全部取引明細TBへセットする運用です。
結果的に、マスタが無くなっても使える為に、数年後バックアップデータを見たりすると便利で楽です。組織コードマスタとか、年単位での変化がある場合にも使ったりしますが、基本的には項目数が少ないです。

2.の場合は一般的な商品マスタと思います。ジャーナル対マスタの関係です。
この場合、質問者様の言われる様に、商品IDのみで良いと思います。
商品マスタの項目数が多く、重要度が高い場合には、これになると思います。
この場合には、商品に変更があった時には、別商品IDを登録して運用する事になるでしょう。新旧を区分する為です。また、製造であれば製品のバージョンアップ時に、新IDを採番するしないで非常に悩むところです。
これは、取り扱う商品の特性により判断します。同時に、IDの採番ルールも大切です。類似品がどんどん発生する様な物であれば、末尾にA~Zを添付して区別する方法もあります。
1.の場合とは違い、一度商品IDの採番ルールを決めると、なかなか変更出来ません。番号が見やすい様に、先頭の数桁を商品種別にする方法も良く取られますが、一旦決めると変更は大変で、システム側としては連番が楽ですね。

こちらの質問内容は、システム屋としては非常に苦慮する所と思います。
また、データベースの正規化と言う分野ではないと思います。

投稿2021/06/30 02:57

tosi

総合スコア553

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

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

0

1 でも 2 でもないですが、
商品のIDは一緒だが名称が変更されることがある、なら、商品名を別のマスタテーブルにする、ですかね。
そちらには適用開始~終了の日付も入れておく。

投稿2021/06/29 07:57

tacsheaven

総合スコア13703

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

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

0

商品マスタテーブルと、取引明細テーブルについての、関数従属の定義によって構成が異なります。

・関数従属あり
1.第2正規形により取引明細テーブルより商品マスタを外部参照する事になります。

2.商品マスタに変更を許す場合、1の関数従属を保証するには、商品マスタは変更の履歴を管理する形式にする必要があります。(概ね日付項目をキーに含める事が多いと思います。)
取引明細には、この追加された履歴管理用の項目を外部参照の項目として追加する必要があります。

・関数従属なし

1.取引明細では、商品マスタを入力での補完として引用し、取引明細にも商品マスタと同項目を保持。
よって、外部参照は不要。

2.商品マスタに変更を許すかどうかは、取引明細とは関係なく独立。
3.商品マスタが時系列的な引用が必要な場合、履歴型にするが同じく独立。

投稿2021/06/29 10:14

編集2021/06/30 02:16
sazi

総合スコア25173

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

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

0

更新削除不可という状況がわかりませんが

基本商品マスターは当然更新削除します。
ただ取引明細テーブルがある以上取引実績があるものは削除しない運用が望ましいです
特に履歴のテーブルはマスターからデータを引き継いでおくことは肝要
原価がかわル場合売上時点の原価を履歴にうめこまないとその取引における
粗利が確定できないですから

投稿2021/06/30 02:05

yambejp

総合スコア114769

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問