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

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

新規登録して質問してみよう
ただいま回答率
85.46%
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

解決済

2回答

1638閲覧

マッチングアプリのメッセージ機能のDB構造

Yoshiaki_Miyata

総合スコア3

MySQL

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

Laravel

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

PHP

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

0グッド

0クリップ

投稿2021/12/08 23:21

●前提・実現したいこと

Laravel
Mysql

企業と学生のマッチングアプリの開発に当たって、メッセージ機能を実装しております。

メッセージ機能のデータベーズ構造についてアドバイスをいただけますと幸いです。

前提として、ユーザーは2つの属性があり、学生テーブル(Students)と企業テーブル(Companies)と別々で管理しております。
※それぞれ全く異なるカラムのため別々に作成しております。

●困っている点
メッセージ機能のデータベースの構造が分かりません。

ユーザーが1種類のみだけでしたら、

誰が送信したか判別する際は、Uersテーブル1つのみだけだと、messageテーブルを作成し、user_idで判別できると思うのですが、

今回のケースのように、students、companiesの別々の属性のユーザーがいる場合は、どのような構造になるのでしょうか?

●試したこと
student_messageテーブルを作成し、room_id, student_id, textカラムを付与し、
同様にcompany_messageテーブルを作成し、room_id, company_id, textカラムを付与しました。

その場合は指定のroomの指定の会社や学生のメッセージ一覧は取得できますが、

一つのroomでcompany_messageとstudent_messageの二つをLINEのように送った順に表示されるやり方が思いつきません。

そもそも、company_messageとstudent_messageに分けることが非効率なのでしょうか?

他にもっと効率よいDBの構造があれば教えていただきたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

属性カラムを持てばよいのでは。

投稿2021/12/09 00:18

m.ts10806

総合スコア80861

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

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

Yoshiaki_Miyata

2021/12/09 00:59 編集

ご回答ありがとうございます。 >属性カラムを持てばよいのでは。 私の理解不足ですみません。 こちらはどのテーブルに持たせるとよいのでしょうか? 最初Userテーブル一つだけにして、企業、学生などの属性カラムを持たせようかと思いましたが、 それぞれのテーブルが他に持っているカラムが違うため、断念致しました。
kaina

2021/12/09 01:13

横から失礼します。 メッセージテーブルにも企業、学生毎に異なるカラムを持つ必要があるとは思えないので、m.ts10806さんの言う通りかと。
Yoshiaki_Miyata

2021/12/09 01:24

コメントありがとうございます。 どのテーブルに属性カラムを持たせればよいのでしょうか? 現状ではCompany, Studentテーブルがあるので、 誰が発言した内容か区別がつけられないので、別々にMessageテーブルを分けました。 Messageテーブルを一つにした場合、どのテーブルに属性を付与するという認識なのでしょうか? Company, StudentテーブルをUsersテーブル一つにして、属性を付与するということでしょうか? その場合だと、Company, Studenで他に持っている情報が違うので、一つにできない思い、それぞれ分けました。
mepon

2021/12/09 01:43

Messageテーブルに属性カラム作ったら誰の発言かわかるじゃないですか
m.ts10806

2021/12/09 02:59

messageテーブルの話しかしてないですが、物理名はともかく、例えば1だったらcompanyの人、2だったらstudentの人 のいう具合に。
Yoshiaki_Miyata

2021/12/09 04:32

ご回答ありがとうございます。 解決いたしました! Messegeを送信する際にStudentが送信すれば、Student属性(または1)を付与し、Companyの人が送信すれば,Company属性(または2)など属性を付与すれば、一つのMessageteテーブルのみで 完結致しますね!room_idなどを付与すれば、roomごとのメッセージ一覧が取得できるかと思います。 皆さん、ご回答ありがとうございました!
guest

0

一つのroomでcompany_messageとstudent_messageの二つをLINEのように送った順に表示されるやり方が思いつきません。

これだけならそれぞれのテーブルにタイムスタンプを持たせてソートすれば解決出来るかと思いますよ

そもそも、company_messageとstudent_messageに分けることが非効率なのでしょうか?

これは何故そのような設計にしたのか(他にも何か要件があるのか?)次第なので何とも言えません。

例えばmessageテーブルに

  • student_id
  • company_id
  • timestamp

に加え

  • メッセージの方向を示すカラム(学生→会社o会社→学生なのかを示す、例えばis_from_companyの様な感じ)

にしても実現は可能です

投稿2021/12/09 02:29

tanat

総合スコア18716

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

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

Yoshiaki_Miyata

2021/12/09 04:36

ご回答ありがとうございます。 深い意味があるわけではなく、私の設計が非効率なため、分けておりました。 ただ、tanat様が教えてくださった、ような方法は全く思いつかなかったため、今後なにか複雑な設計が必要な際は是非、参考にさせていただきます! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問