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

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

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

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

データベース

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

データベース設計

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

Q&A

解決済

3回答

1327閲覧

リレーションについてのベストプラクティスを知りたい

paranoaman1217

総合スコア24

Laravel

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

データベース

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

データベース設計

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

0グッド

0クリップ

投稿2019/11/19 03:13

編集2019/11/19 03:17

お世話になっております。
考えていたらしっちゃかめっちゃかになってきてしまい助言を頂きたく投稿しました。
メルカリのようなサービスを考えていて、一人のユーザーは自分の商品を複数登録することができます。
ユーザー1:商品N
この商品は業者アカウントで見ることができてコメントをすることができます。
同様にユーザーも商品に対してコメントをすることができます。

ユーザー  業者
↓  ↓
コメント
|
商品

最初Laravelの1対多(ポリモーフィック)を使用しようと考えました。

users
id - integer
title - string
body - text

traders
id - integer
title - string
body - text

comments
id - integer
body - text
commentable_id - integer
commentable_type - string

ただこれだとユーザー側が自分の登録した商品詳細を見た時、業者が商品詳細を見た時に自分のコメントしか抽出できないのでは?
と思い分からなくなってきてしまいました。
ユーザー側が自分の商品詳細を見ても、業者が商品詳細を見ても、商品に紐付くコメントは新着順に全件見れれば良いだけという仕様で、単純に、
商品1:コメントN
の紐付けのみでコメントテーブルには「ユーザー」「業者」のどちらがコメントしているのか判別できるカラムだけ用意しておけばいいのかな?
と考えたんですが間違っているでしょうか?
こういう形の場合のよくあるリレーションの設計方法があればご教示いただけないでしょうか。

何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

こちらに自分が回答した同様の問題があります。
参考になるかと思います。
https://teratail.com/questions/221911#reply-325162

投稿2019/11/19 04:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

paranoaman1217

2019/11/19 05:11

ご回答いただきありがとうございます! 拝見させていただき、一点質問させていただきたいのですが、エンドユーザーと、業者で登録内容が全く異なる場合Kosuke_Shibuya様ならどのような設計にしますでしょうか? 参考までご教示いただけないでしょうか?
退会済みユーザー

退会済みユーザー

2019/11/19 05:14

「エンドユーザーと、業者で登録内容が全く異なる」 コレについての詳細な仕様を具体例を添えてご説明願います。 それがないので、具体的な回答が困難です。
paranoaman1217

2019/11/19 05:28 編集

情報が足らずすみません。。 Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id')->comment('ID'); $table->string('user_name')->nullable()->comment('ユーザー名'); $table->string('email')->unique()->comment('メールアドレス'); $table->string('password')->nullable()->comment('パスワード'); $table->timestamp('email_verified_at')->nullable()->comment('メール認証用'); $table->rememberToken(); $table->timestamps(); }); Schema::create('traders', function (Blueprint $table) { $table->bigIncrements('id')->comment('ID'); $table->string('company_name')->nullable()->comment('会社名'); $table->string('public_email')->unique()->comment('公開用メールアドレス'); $table->string('company_email')->unique()->comment('管理者用メールアドレス'); $table->string('public_tel')->unique()->comment('公開用電話番号'); $table->string('company_tel')->unique()->comment('管理者用電話番号'); $table->string('password')->nullable()->comment('パスワード'); // 定休日、営業時間、創業年月日、サイトURL、紹介文、店舗住所(複数)、スタッフ(複数)etc... $table->rememberToken(); $table->timestamps(); }); 業者のテーブルに関してはまだ作っていませんが、概ね入りそうなフィールドをコメントアウトで記しました。当初の想定では登録内容もだいぶ違うのでマルチ認証を検討しておりました。
退会済みユーザー

退会済みユーザー

2019/11/19 05:32

traders の時にログインに利用するのはどちらのメールアドレスですか?
paranoaman1217

2019/11/19 05:34

$table->string('company_email')->unique()->comment('管理者用メールアドレス'); こちらになります! エンドユーザーと業者アカウントではログイン場所もそれぞれ用意します。
退会済みユーザー

退会済みユーザー

2019/11/19 05:36

自分だったら、users はあくまで共通。業者独自のデータのみ、TraderMeta とか用意して、User と TraderMeta を HasOne で定義しますね。
退会済みユーザー

退会済みユーザー

2019/11/19 05:38 編集

その方が、Policy を利用することで、権限を分けたり、middleware を利用してroute を管理しやすくなるからです。
退会済みユーザー

退会済みユーザー

2019/11/19 05:51

提示されたカラムの様子を見ると、trader => companies とする方が自然ですね。
paranoaman1217

2019/11/19 05:59

ご回答いただきありがとうございます! 構成考え直してみました。 $table->bigIncrements('id')->comment('ID'); $table->unsignedBigInteger('role_id')->after('id'); $table->string('email')->unique()->comment('メールアドレス'); $table->string('password')->nullable()->comment('パスワード'); $table->timestamp('email_verified_at')->nullable()->comment('メール認証用'); $table->rememberToken(); $table->timestamps(); usersテーブルでエンドユーザー、業者アカウント共通で使えるフィールドを用意し、それぞれの独自データはTraderMeta、UserMetaを作成する。 私的にもすごくスッキリしました! 大変参考になりました!
guest

0

ユーザー関連のテーブルをひとつにしてユーザータイプで区分けした方がスッキリすると思います。
同じ定義ならなおさら分ける意味がないかと

投稿2019/11/19 03:37

m.ts10806

総合スコア80850

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

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

paranoaman1217

2019/11/19 03:50

ご回答いただきありがとうございます! エンドユーザー側では新規会員登録からメール認証などを行いログインする仕様です。 一方業者側は一般問い合わせから運用サイドで業者を審査し、ログインアイパスを発行するような形で ログインページも分ける想定です。登録内容はエンドユーザーと業者アカウントでは全く違う内容にまります。 アカウント管理用の中間テーブルを作成し、ユーザー、業者用のテーブルを作るとかだと一限管理もできてコメントも取れそうでシンプルな設計になりそうですね。 検討します、ありがとうございます!
m.ts10806

2019/11/19 03:53

ログインページ分けるのでしたらテーブル同じでも送り元によって区分を固定値で渡しやすくなるのではと思います。
paranoaman1217

2019/11/19 06:04

ご回答いただきありがとうございます! 今の構造を見直すいい機会なのでトライしみます、ありがとうございました!
guest

0

Laravelはよくわかんないけど、UserとTraderはどう違うのかがちょっと疑問。

まぁリレーションの設計という意味では、商品1:コメントNにしておいて、usesrs(id)-comments(id)の関連とtraders(id)-comments(id)の関連をそれぞれ別テーブルに持っておけば、全部JOINすることも区別することもできると思いますが。

投稿2019/11/19 03:31

gentaro

総合スコア8949

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

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

paranoaman1217

2019/11/19 03:41

ご回答いただきありがとうございます! エンドユーザー側のアカウントと、業者側のアカウントの2種類ありまして、ユーザーの登録商品を業者アカウント側で査定するようなCtoBのサービスを考えています。その際に商品に対してのやり取りをコメントで残せる機能(メルカリと作りは全く同じだと思います)がありまして、1テーブルで管理しようと考えていました。 シンプルにテーブル分ければ直感的ですし取り回しはしやすそうです! ありがとうございます! Laravelのドキュメントを見ていると色々な紐付きができる機能があったので端から見ていたらよく分からなくなってきてしまっていました汗
gentaro

2019/11/19 03:53

UserとTraderの違いが気になった原因でもありますが、質問文の定義だとcommentsテーブルにidとcommentable_idというIDを表すカラムが2つあって、それぞれ何を入れるつもりか読み取れませんでしたが、おそらく1つはusersやtradersテーブルに対するリレーションを表す目的だと思います。 で、UserとTraderが概念的に違うもの(別テーブルに分ける相当の理由があるもの)であれば、それぞれのIDに対してリレーションを貼るためのカラムが必要になるはずで、comment自体のIDと合わせて3つないとおかしいわけです。 UserとTraderの「いずれかのID」が入るつもりでカラムの設計をしているとしたら、それは大間違いだと思いました。(ひとつの概念に対してひとつのIDであるべきで、異なるIDが同一のカラムに入る設計はおかしい)
paranoaman1217

2019/11/19 04:09

ご回答いただきありがとうございます! 私も当初その形を考えていて、 comments id - integer user_id - integer trader_id - integer body - text エンドユーザー、業者双方で登録があった時に id - 1 user_id - 1 trader_id - null body - test1 id - 2 user_id - null trader_id - 1 body - test2 このような形を考えていたんですが、Laravelでポリモーフィックというリレーションルールがあり、 comments id - integer body - text commentable_id - user_id,trader_id commentable_type - 区分けをするためのモデル名(App\Models\UserやApp\Models\Traderが入る) おそらくコメントにまつわる全て(商品のコメント以外でも使う)を1テーブルで管理できるような方法があり導入できないかなと考えていました。 ご回答いただき今の設計の大元を崩さずに行くのであれば、当初の comments id - integer user_id - integer trader_id - integer body - text 上記の形が一番今の私のベストかもしれません。ただuser_id,trader_idどちらかがnull値になってしまうのでそこが気になります。
gentaro

2019/11/19 05:22 編集

> ただuser_id,trader_idどちらかがnull値になってしまうのでそこが気になります。 回答はそこを加味して考えた上でのものです。
paranoaman1217

2019/11/19 06:15 編集

ご回答いただきありがとうございます! この方法が今の構造を見直さないで実装できるので今後採用する可能性もありますが、 元々のユーザーデータの構造を見直すいい機会なのでまずはそちらにトライしてみようと思いました。 その上でどのみち振り分けが必要になりそうなので上記方法で実装しようと思います! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問