"も"日記

思考整理のためにいろいろ書き殴っていきます

データベースの設計とか

Excelで管理されているマスタをDBでの管理に移行するため、
DB構造を考える必要があったので考えたことを整理。

現状ではexcel管理の情報で、一つのセルに複数の項目が記載されていたり、
同じ項目なのに標記揺れがあったりとめちゃくちゃ…。
<現状のテーブル>

製品名 仕様
製品A AAA,BBB,CCC
製品B BBB,CCC,DDD
製品C AAA’,BBB,DDD,EEE

今は表示だけにしか使用されていないのでそれでも何とかなっているのだが、
項目の有無によっては製造工程が変化したり、製造順に関わる項目もあるので、
生産計画の立案にも使用していきたい。

<要件>
① 1製品ごとの仕様を記録
② 製品によって仕様項目・項目数が異なる
③ 仕様項目は増減が予想されている
④ 項目/内容の両方で検索できる

案①

全て一つのテーブルでまとめる。

イメージ

製品名 仕様① 仕様② 仕様③ 仕様④ 仕様⑤
製品A AAA BBB CCC 予備 予備
製品B BBB CCC DDD 予備 予備
製品C AAA’ BBB DDD EEE 予備

製品をキーにあらかじめ多めに仕様入力用のカラムを設定しておくタイプ。
これはまあ素人目に見てもNGとわかる設計。
列ごとで項目がそろっていないため、検索もできず、また標記揺れも防ぐことが
出来ないので全く用途に合っていない。
そもそもこれならExcelでいいよねって話になる。

案②

製品マスタ、項目マスタを作成し、中間テーブルで紐づける。

イメージ
<製品マスタ>

ID 製品名
1 製品A
2 製品B
3 製品C

<仕様項目マスタ>

ID 仕様項目
1 仕様項目①
2 仕様項目②
3 仕様項目③

<中間テーブル>

製品ID 仕様項目ID 仕様内容
1 1 AAA
1 2 BBB
1 3 CCC

このパターンでは、中間テーブルを用いることで、仕様項目での検索が
実現できており、一見要件を満たしているように見える…のだが、
choiceなどで仕様内容を縛れないので標記揺れが生じてしまう。
めちゃくちゃコードを工夫すれば、セレクトを生成してどうにか…みたいなことも
出来るのかもしれないが、メンテの少ないコードを書く自信が起きないので没。

案③

製品マスタ、仕様項目マスタに加えて、仕様内容マスタを作成し、仕様内容IDと製品ID中間テーブルで紐づける。 イメージ
<製品マスタ>

ID 製品名
1 製品A
2 製品B
3 製品C

<仕様項目マスタ>

ID 仕様項目
1 仕様項目①
2 仕様項目②
3 仕様項目③

<仕様内容マスタ>

ID 仕様項目ID 仕様内容
1 1 AAA
2 2 BBB
3 3 CCC

<中間テーブル>

製品ID 仕様内容ID
1 1
1 2
1 3

案②で解決できなかった標記揺れを解決できるように工夫した形。
項目を管理するテーブルと項目に関する内容を管理するテーブルを作成することで、
検索性を保ちながら標記揺れを防ぐことができるし、
項目IDでレコードを引っ張ってきてやるだけで、セレクトボックスを生成してやることもできる。
もちろん、マスタの登録者が先に内容テーブルを作成しなければいけないという手間は増えるが、
大量に入力されたデータを後からメンテしたり、コードのメンテしたりということを考えるとこれがベストなのかなと。

まあ、素人なりの最善ということ多少ガバでも許して…。