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

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

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

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

SQL

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2171閲覧

最小単位で繋がないデータベース設計はありえるか(後から最小単位が増える可能性)

riz

総合スコア30

MySQL

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

SQL

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/03/19 12:28

実現したいこと

プログラミング学習中で,Laravelを用いて商品検索システムのようなものを作っています。
「スマホ」と入力したら「ヨドバシカメラ・秋葉原店」などと出力するイメージで,現在のデータベースは↓のようにしています。
ER図

しかし,この構成だと,
① 支店名をnull(任意入力)として店名と商品名だけ繋げるような関係を登録できない
② 今後,より小さい単位の「機種名やブランド名」で検索できるようにした場合,データベースをゼロから作り直す必要がある
のような問題があるのではないかと感じ始めました。

そこで,↓のように,
1.大きい単位である店名と商品名を中間テーブルで繋ぐ
2.中間テーブルのidに,追加情報として小さい単位の情報を入れてく
ということを行えば,上記の問題がどちらも解決できるのではないかと考えました。
考えたER図

論理的な構成ではない汚い設計だと思うのですが,このような最小単位同士を繋がないデータベースが実務上用いられることってあるのでしょうか。
また,このような設計をしたときに問題となりそうなことや,「Laravelの便利機能使えばそもそもこんなことする必要ない」などあればご意見頂きたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

店と支店は店の属性が違うという風に考え、
店(ID,名前,区分)

店での取り扱いする商品は
店・商品(店ID,商品ID)
という中間テーブルで構成。

店と支店の関係は中間テーブルでもいいし、再帰が使えるならナイーブツリーにする。

総じて、類似したエンティティを見つけ出し、冗長に分割されていないかどうか、という視点も持った方が良いかと思います。

以下は類似した内容ですけど、目を通されると良いかと思います。
「SQLアンチパターン」を避けるためのチェックリスト①(DB論理設計編)
データベース論理設計のアンチパターン

投稿2019/03/19 12:49

編集2019/03/19 14:50
sazi

総合スコア25173

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

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

riz

2019/03/19 14:02 編集

回答ありがとうございます!いままでの設計から支店名を分割することばかり考えていましたが、確かにそちらのほうが合理的かもしれないです。 私の知識不足で正しく読み取れていないかもしれないのですが、 実質的な意味を持つテーブルは店と商品の2つにして、支店とブランドはそのテーブルの列として追加するのがよい (=全てのエンティティを分割したら要素の重複は無くなるが、管理が複雑。一方で1つのテーブルに全てまとめるは管理が簡単だが要素の重複が多すぎる。だからその中間で妥協しよう) というような理解でよろしいでしょうか。
sazi

2019/03/19 14:33

商品と店については一般的な概念で話をしています。ブランドと支店が結び付くというのは理解に難く、独自の概念があるのでしょうから、返答に困ります。 妥協するではなく、本質を見極めるという意味だったのですが。。。
riz

2019/03/19 14:41

ありがとうございます。 Excelのピボットテーブルしか見たことなかったような人間なので、どこまでの分割が本質的かの感覚も持てていませんでした。。。 参考になりましたので、ベストアンサーとさせて頂きます。
sazi

2019/03/19 14:52

追記しました。 ナイーブツリーとかもアンチパターンですけど、DBMSによってはアンチパターンにはならないという事もあります。
guest

0

(店cd)(支店cd)(ブランドcd)(実商品コード)
0000-1111-2222-3333

その手のコード体系の作り方の一例

投稿2019/03/19 12:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sazi

2019/03/19 12:52 編集

コード体系作り出すと、保守が大変になるデメリットがありますよね。
退会済みユーザー

退会済みユーザー

2019/03/19 12:55

行政が好きだけどねこれ(笑) 都道府県-行政区画方式-市区町村番号←市区町村コード
sazi

2019/03/19 13:03 編集

既に存在しているものはしょうがないw その場合でも、サロゲートキーをお薦め。
sazi

2019/03/19 13:10

そもそも、最小単位が増える可能性という質問なので、その場合はコード体系振り直しって事になります。
退会済みユーザー

退会済みユーザー

2019/03/19 13:37

店舗商品コード:(店)-(支店)-(ブランド)-(商品) カテゴリ商品コード:(カテゴリ)(商品) みたいに目的別にコードをふればいいのさ(脳死判定)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問