🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

SQL

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

データベース

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

データベース設計

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

Q&A

解決済

2回答

2426閲覧

テーブル設計についてアドバイスお願いします。

bws

総合スコア98

MySQL

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

SQL

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

データベース

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

データベース設計

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

0グッド

1クリップ

投稿2019/09/13 04:04

編集2019/09/13 07:28

jan テーブル

|id(int)|item_id(int)|client_id(int)|jan(varchar)|price(int)|rate(int)|
|:--:|:--:|:--:|:--:|:--:|
|1|1|1|1234567890|100|60|

item_idからjanやprice, rateを取得するような形になっていましたが、
新たに品番(product_number)からも取得できるようにする必要が出てきました。
そこで以下のようにテーブルを変更してitem_idで取得する場合とproduct_numberで取得する場合を切り分け用としているのですが、とてもいい案とは思えません。
もし良い方法があれば教えていただけると助かります。よろしくお願いします。

検討している変更

|id(int)|item_id(int)|client_id(int)|jan(varchar)|price(int)|rate(int)|product_number(varchar)|
|:--:|:--:|:--:|:--:|:--:|:--:|
|1|0もしくはnull|1|1234567890|100|60|ABC-0001|

経緯

itemテーブルとproductテーブルが存在していて、itemテーブルは商品のカテゴリーのような役割になっています。

もともとproductの種類数が多い為、janコードをすべてitem(カテゴリー)毎に統一しているという珍しい管理方法をしています。なのでproduct毎にjanを設定していませんでした。

そして今回必要な場合はproduct毎にもjanを設定しなければならなくなったという状況です。

itemテーブル

id(int)name(varchar)
1アイテム1

productテーブル

|id(int)|name(varchar)|item_id(int)|product_number(varchar)|
|:--:|:--:|
|1|商品1|1|ABC-001|

追記

clientテーブル

取引先ごとにJANが違う場合があるのでJANテーブルが必要でした。

id(int)name(varchar)
1取引先1

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

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

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

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

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

mikkame

2019/09/13 04:06

なぜ、いい案とは思えないのか追加すると回答が得やすいかと思います
moredeep

2019/09/13 04:31

id、item_id、product_numberがそれぞれ何を意味していて、それらの関係性はどうなっているのかを示さないと、勘で答えることになっちゃうんじゃないですかね。 そもそもなのですが、 > item_idで取得する場合とproduct_numberで取得する場合を切り分け これを行う理由がわからないです。要件(なぜそれをしなければならないか等)から書いてある方がやりやすいかもしれません。
bws

2019/09/13 04:49

mikkameさん こんなやっつけな感じで大丈夫なんだろうかと思って質問させていただきました。すみません。 moredeepさん ありがとうございます、経緯などを追記させていただきました。
guest

回答2

0

ベストアンサー

別なコード体系を一つのテーブルに併用する事はよくあります。
極端に言えば、サロゲートキーとナチュラルキーなどが該当します。
さらに、ここに別な体系のナチュラルキーを追加しても別におかしくはありません。

他のテーブルのリレーションとして、混在させるのは不備となる場合はあるでしょうが、単独のテーブルだけでおかしいとは断言できません。

追記

現状の関係としては
・jan→(外部キー)→product
・jan→(外部キー)→item
・product→(外部キー)→item
ですね。

ネックになるのは、janが決まらないproductがあるかどうかです。
あり得るのなら、現状のまましかありませんが、無いという事なら
・product→(外部キー)→item
という関係は無く、productにitemは不要です

ただ、元々itemにjanが紐ついている状態では、itemはカテゴリーという位置付けでは無かったのではないですか?

純粋なカテゴリーという位置付けなら、
・product→(外部キー)→item
という関係で、productにjanの項目を持たせて、janは廃止というのが素直じゃないでしょうか。
これであれば、サロゲートキーでproduct_numberもjanもナチュラルキーとして各々確定するタイミングも独立させる事ができます

投稿2019/09/13 04:43

編集2019/09/13 06:13
sazi

総合スコア25327

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

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

bws

2019/09/13 05:22

ありがとうございます。 他のテーブルのリレーションとして混在しているかもしれません。関係ありそうなテーブルと経緯を追記しました。よろしくお願いします。
bws

2019/09/13 06:21

ありがとうございます。 もともと商品の種類数が多い為、janコードをすべてitem(カテゴリー)毎に統一しているという珍しい管理方法でしてjanが決まらないproductがほとんどなんです。 ただ今回必要な場合はproduct毎にもjanを設定しなければならなくなったという状況です。
sazi

2019/09/13 07:07 編集

では、janテーブルを廃止してproductに統合ですね ただ、productに対してjan付きのitemを紐づけるような場合には決めが必要でしょうけど
bws

2019/09/13 07:31

ありがとうございます。 取引先でJANが違う場合に対応するために実はjanテーブルにはclient_idがありまして、関係ないのでややこしくなると思い、最初に省いてしまっていました。 まさかここで必要になるとは思いませんでした。なんども手間をかけてしまって…本当に申し訳ないです。
sazi

2019/09/13 18:00

項目名だけでは関係が分からないので、ナチュラルキーでの一意キーを示してください。
bws

2019/09/14 01:04

ありがとうございます! ナチュラルキーで一意なものはありません。 ユニークなのはそれぞれのテーブルにオートインクリメントで設定されたサロゲートキーだけです。
sazi

2019/09/14 15:22

> ナチュラルキーで一意なものはありません それは設計としてよろしくないですね。 例えばjanテーブルだと、(client_id, jan)が一意でなく重複して登録されるという事ですか?
bws

2019/09/16 00:31

ありがとうございます。 クライアント毎にjanを登録できるようにしているのですが、同じjanの場合もあるので、client_idとjanは重複する場合があります。
sazi

2019/09/16 02:43

では、(item_id, client_id, jan)で一意ですか?
bws

2019/09/16 02:50

(item_id, client_id, jan)で一意になっております!
sazi

2019/09/16 02:52

そういった具合で一意キーを明らかにして下さい。
bws

2019/09/16 03:13

以下のようになっております。 janテーブル (item_id, client_id, jan) itemテーブル (name) clientテーブル (name) productテーブル (name) productテーブルのproduct_numberは同じproduct_numberで色違いの商品が登録される可能性があるため一意ではありません。
sazi

2019/09/17 01:38

product とjanの関係が(item_id, client_id, jan):(product_id)で1:1ならjanへの追加はproduct_numberではなくproduct_idでしょう。 product :jan=n:nなら中間テーブルが必要です。
bws

2019/09/17 02:04

ありがとうございます。 productテーブルが以下のようになっていてproduct_number毎にjanを設定したいのですが、そもそもproductの設計が変でしょうか? 1 商品1黄 ABC-001 2 商品1赤 ABC-001 3 商品1緑 ABC-001
sazi

2019/09/17 02:51

色違いはproductとは別にした方が良いかと思います。 配列が可能なDBMSなら配列にする場合もありますけど、MySQLなら中間テーブルの扱いが良いかと。
sazi

2019/09/17 02:56

Janを軸にする視点から抜け出せていないように見受けられます。 製品というオブジェクトを軸にし、それに対する属性として様々なものを付与していく(JANコードとか製品番号とか)と考えると明確になると思います。
bws

2019/09/17 03:48

最後まで本当にありがとうございました。 productの色違いを中間テーブルにしなかったところから、janテーブルにproduct_numberを追加せざるを得ないという違和感が生まれていたことがわかりました。
guest

0

item_idとproduct_numberの相関関係による

  • item_idおよびproduct_numberの両方がすべてのitemにユニークに付加されている場合

→正規化のしようもないので、それぞれ別にカラムを持てばいい
→ただしテーブルに二重にユニーク制限をかけるのでどちらか一つにして運用でカバーするのもありかも

  • item_idもしくはproduct_numberのいずれか片方がユニークで全てに付加され、もう片方はユニークではないか抜けがある場合

→ユニークな方を軸に正規化すればよい

  • item_idおよびproduct_numberの両方とも、ユニークでもなければ全てに付加されるわけでもない

→idを元に両方ともバラバラに正規化する

投稿2019/09/13 04:44

yambejp

総合スコア116690

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

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

bws

2019/09/13 05:25

ありがとうございます。 どのパターンなのかも判断できずでして、本当に申し訳ないです。
yambejp

2019/09/13 05:43

> 判断できず いやそうじゃなくて、それを決めるのは質問者さんです 現時点でやっているのは要求定義(なんとなくこんな機能欲しい) 具体化するのは要件定義(具体的にどんな仕様にしよーか) コード体系を質問者さんが決めればあとは下流が考えること
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問