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

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

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

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

4回答

1619閲覧

おすすめのDBの設計

laravel_prog

総合スコア2

MySQL

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

1グッド

2クリップ

投稿2022/04/08 08:29

編集2022/04/08 13:36

昨年自身で作成したECサイトのようなシステムの,DB設計に関する質問です.

前提

Web系の開発(HTML,JS,PHP,MySQL)は半年ほど,Laravelは触り始めて3か月ほど経ちます.
知識も経験も足りませんので,お力をお貸しいただければと思います.

このシステムはHTML,jQuery(JS),MySQL(操作はPDO),PHPとその拡張機能(メール送受信,PDF作成)で作られています.

このシステムをメンテナンスしやすいようにLaravelに移行しようと設計から見直していたのですが,元の機能を維持した移行が難しそうだったので設計が間違っているか,若しくはコーディング技術が足りないか,ご教示いただきたいです.
移行後もDBは変わらずMySQLの予定です.

今までの設計

このシステムにユーザ登録を行うと,ユーザに個別のユニークidが割り当てられ, user_list テーブルに保存されます.
また,同時にユーザ個別の注文テーブルも作成されます.

user_list
user_iduser_nameuser_addresspassword(hashed)
1hoge太郎hoge@example.com${hogeHashed}
2fuga次郎fuga@example.com${fugaHashed}

ユーザの注文内容等は,ユーザのidを名前に含んだテーブル order_{$user_id} に記録されます.
一度の注文ごとに注文のidが割り当てられ管理されます.

order_2 (fuga次郎の注文内容)
order_idorder_nameorder_datestatus
1おだんご20XX_01_01delivered
1おまんじゅう20XX_01_01delivered
2きんつば20XX_02_11cancelled
3ようかん-in_cart

今回質問したいこと

ユーザごとの処理を軽くする,ユーザごとに注文を管理しやすいなどの観点からメリットがあると考え,このような設計を行いました.
しかしながら,この挙動がLaravelらしいのか(後々にチームでのメンテナンスがシームレスにしやすいか),前述したメリットは実は大きくないのか,Laravel以前にそもそもこのような設計はしてはいけないのか(脆弱性を孕みやすいか) などが質問内容です.

設計案

今のところ思いつく設計としましては,

  1. このままLaravelに移行する
  2. 注文テーブルを一つにまとめ,その中でユーザidを持ちユーザを区別する
※2 order_table
order_iduser_idorder_nameorder_datestatus
11おだんご20XX_01_01delivered
11おまんじゅう20XX_01_01delivered
21きんつば20XX_02_11cancelled
31ようかん-in_cart
42おだんご20XX_03_21delivered
42おまんじゅう20XX_03_21delivered
52きんつば20XX_04_30cancelled
62ようかん-in_cart

のどちらかですが,メリット/デメリット/その他 ご教示いただけますでしょうか.

hoshi-takanori👍を押しています

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

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

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

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

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

guest

回答4

0

テーブル設計についての質問でしょうか?
ユーザーマスターはあるのに商品マスターがないのは片手落ちです
ユーザーマスターと商品マスターをリレーションするオーダーテーブルがあればよいでしょう
オーダー手ブルの仕様はuser_ud,product_id,日付,数量,金額,status
order_name的なものは商品マスターから引っ張ってくるものです

投稿2022/04/08 08:35

yambejp

総合スコア114779

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

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

退会済みユーザー

退会済みユーザー

2022/04/08 09:02

その時の商品マスターは、価格変更など商品情報が変更されても、古い注文の情報が壊れないような設計であってほしいですね。商品情報の有効期間を設けるとか、有効フラグのようなものを設けるとかすれば良さそうですが。
laravel_prog

2022/04/08 13:49

ありがとうございます. オーダテーブル内でのデータの扱いは,「商品マスタを参照してINSERTするが,飽くまでその時のデータとして持ってくるだけであって,ポインタのように商品マスタの変動によってオーダテーブル内の既存データが勝手に書き換わったりしない」ようにすべきというような意味合いでしょうか.
guest

0

ベストアンサー

order_table は1つにまとめるのが普通です。ユーザごとに分けるのは、よくないやり方です。

ユーザごとの処理を軽くする,ユーザごとに注文を管理しやすいなどの観点からメリットがあると考え,このような設計を行いました.

ユーザごとの処理は軽くなるかもしれませんが、商品単位での処理を行うために数千・数万のテーブルを扱う必要があります (例えば集計処理や、発売日到達による出荷のため一括ステータス変更、発売中止による一括キャンセルなど)。カラム追加が発生したときも大変です。

ちなみに少数の法人単位でデータベースやテーブルをわけることはたまにあります (マルチテナント)。
例えば大規模ECサイトサービスを大手スーパーA・大手百貨店B・大手コンビニC に利用してもらうとして、
・法人ごとに要望が異なりテーブル構成も異なる
・セキュリティ上明確にデータベースを分けたい
・ある法人が高負荷になっても他の法人には一切影響がないようにしたい
・似て非なるテーブルがあって開発/運用が複雑でもペイするような利益が見込める
という場合に採用します。ユーザごとに分けるのはメリットがないと思います。

また nukasa さんが提示されているように、注文と注文明細は別テーブルが普通です。
まとめてしまうと、注文単位での処理 (決済・キャンセル・発送など) が管理しづらくなります。

投稿2022/04/08 12:45

68user

総合スコア2005

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

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

68user

2022/04/08 12:48

この本をおすすめしておきます。別にこれが正解とは言いませんが、「一般的にはこうする」というのを把握しておいて損はありません。 https://www.amazon.co.jp/dp/4798157384
laravel_prog

2022/04/08 14:15

ありがとうございます. なるほど. 確かに商品単位での処理や仕様変更等についての配慮が足りていませんでした. 例外(マルチテナント)についても詳細に記述してくださり,考えが及んでいない視点だったので大変為になりました. (そもそもMVCの設計すらまともにできていませんでしたが,)注文単位での処理については,本来であればPHPのコントローラのような役割を担う場所で行ってしまっていたために管理のし辛さが明確化されておりませんでした. この処理の管理は本来DBの設計段階で負うべき責務なのですね. 本についてもありがとうございます. まさにその「一般的にはこうする」の情報が欲しかったので渡りに船でした. 学びが多く,私にとって大変貴重なご回答でした. ありがとうございました.
guest

0

注文テーブルを一つにまとめ,その中でユーザidを持ちユーザを区別する

こちらを選択するのは当然として、関係モデルの正規化について勉強しましょう。
まともに正規化すれば、こんな感じになります。
イメージ説明

投稿2022/04/08 11:16

nukasa

総合スコア406

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

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

laravel_prog

2022/04/08 14:23

ありがとうございます. なるほど. 正規化というのですね.このような図も初めて見ました. 注文自体とその内容も別テーブルで管理するのですね. 確かにその方が管理しやすそうです. 図中の記号等わからないことが多いのでいろいろ調べてみようと思います. その足がかりとしての良き地図をいただいたような感覚です. 大変貴重なご回答です. ありがとうございました.
guest

0

投稿2022/04/08 15:01

Orlofsky

総合スコア16415

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

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

laravel_prog

2022/04/10 23:38

詳しい記事をありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問