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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース設計

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

Q&A

解決済

2回答

655閲覧

列持ちテーブルの改善について

chibi144

総合スコア64

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース設計

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

0グッド

0クリップ

投稿2018/01/29 08:18

前提

利用者に親品番を検索させて、部品品番を表示するWEBアプリがあります。
PHPとMySQLで作られています。
現在、DBの中は以下の図のようになっています。

親品番図面ID部品A部品B部品C部品D
id_01Z_01A-001A-002A-003
id_02Z_01A-001A-002A-003(2007年以前),A-004(2008年以降)
id_03Z_02A-001A-002A-003表側:A-005, 裏側:A-006
図面ID部品Aのカテゴリ名部品Bのカテゴリ名部品Cのカテゴリ名部品Dのカテゴリ名
Z_01キャップラベル
Z_02キャップラベル特殊シール

部品A~Dは親品番の部品で、
部品の数・部品のカテゴリ名は、親品番がどの図面IDを持つかによって異なります。
部品品番は親品番ごとに異なります。
品番ごとの部品数、図面ごとのカテゴリ数については十分なカラムを準備しています。
部品品番にカテゴリ名が連動している訳ではないようです。

このDBを最初作ったときの話では1つのカテゴリに対し1つの部品ということでしたが、
複数部品を登録したい、品番以外の文字情報を登録したいという要望があり、
現在、複数品番についてはコンマ区切りで登録、
品番以外の文字情報についてはPHP側でそれ専用に処理することで解決しています。

どうもやりづらい、管理がしんどいと思ってきましたが、
つい先日このやり方がバッドノウハウだということを知りました。

現在悩んでいること・疑問

  • 下の改善案で考え方は正しいでしょうか。
  • 部品の組み合わせや図面のカテゴリ名について他の部署の人にエクセルで編集してもらい、

その後csvにしてDBにインポートしています。
そのときのエクセルの編集しやすさだけを考えるなら、列持ちのままにした方がいいような気もします。

  • この流れ(エクセル⇒CSV⇒MySQLでインポート)自体がやり方としておかしいのでしょうか。
  • 下の改善案だと(2007年以前)、表側:A-005 のような細かい表現が難しくなります。

このような(現場からは「表示できないと困る」と言われるような)事象に対して、
皆さんはどう事前に対策、あるいは事後解決されていますか。

改善案

部品品番、カテゴリ名について列持ち ⇒ 行持ち

親品番場所部品品番備考
id_01AA-001
id_01BA-002
id_01CA-003
id_02AA-001
id_02BA-002
id_02CA-0032007年以前
id_02CA-0042008年以降
id_03AA-001
id_03BA-002
id_03CA-003
id_03DA-005表側
id_03DA-006裏側
親品番図面ID
id_01Z_01
id_02Z_01
id_03Z_02
図面ID場所カテゴリ名
Z_01Aキャップ
Z_01B
Z_01Cラベル
Z_02Aキャップ
Z_02B
Z_02Cラベル
Z_02D特殊シール

試したこと

PHP 5.6
MySQL 5.6

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

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

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

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

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

guest

回答2

0

・下の改善案で考え方は正しいでしょうか。

いいんじゃないでしょうか

・部品の組み合わせや図面のカテゴリ名について他の部署の人にエクセルで編集してもらい、その後csvにしてDBにインポートしています。
そのときのエクセルの編集しやすさだけを考えるなら、列持ちのままにした方がいいような気もします。

編集のし易さというならそうですね。

・この流れ(エクセル⇒CSV⇒MySQLでインポート)自体がやり方としておかしいのでしょうか。

取込の方法は別にして、エクセルデータを元に取り込みを行うというのは良くある話だと思います。

・下の改善案だと(2007年以前)、表側:A-005 のような細かい表現が難しくなります。
このような(現場からは「表示できないと困る」と言われるような)事象に対して、
皆さんはどう事前に対策、あるいは事後解決されていますか。

テーブルデザイン ←→ 表現とは考えず、テーブルデザイン←→(加工)←→表現と考えます。
DBの正規化とUIを、必ずしも直結したものとは考えなければいい話じゃないでしょうか。

投稿2018/01/29 14:32

編集2018/01/29 14:33
sazi

総合スコア25173

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

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

chibi144

2018/01/31 00:28

ご回答ありがとうございます。 >> 取込の方法は別にして、 ×MySQLで ○phpMyAdminで ですね、すみません……。 >> テーブルデザイン ←→ 表現とは考えず、テーブルデザイン←→(加工)←→表現と考えます。 備考に持っていった文字列について、 その種類(前に置くか、()に入れるか)をどうやって認識させたらいいのか分かりません。 もう一つカラムを設けて、そこに「前に置く」「()に入れる」のように記入したら良いのでしょうか。
guest

0

ベストアンサー

親品番に対して部品Aや部品Bのように変更もなく常に存在するものは一覧形式が一番効率がよいでしょう
部品Cのように途中で変わるものについても冗長な表示で良ければ今のままでよいかと。
部品Dのようにオプショナル(っぽい?)で複数部品の組み合わせが必要な場合だけ
分けるとよいかもしれません。
その他拡張したり、無限に部品が増えたり、特別な属性をもたせるときなどは
改善案のような拡張ルールを作る必要が出てくると想います

投稿2018/01/29 08:35

yambejp

総合スコア114779

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

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

chibi144

2018/01/31 00:18

ご回答ありがとうございます。 頂いた意見を参考にしつつデータを更新する人と話し合った結果、 複数品番を登録したい状況、複数品番を登録する際の書き方はほぼ一定(上の例の通り)ということで、 部品テーブルは現行のまま維持することになりました。 今後拡張の必要が出てきたらもう一度悩もうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問