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

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

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

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

データベース設計

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

Q&A

解決済

3回答

573閲覧

テーブル設計について

avantgarden

総合スコア121

MySQL

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

データベース設計

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

0グッド

2クリップ

投稿2022/12/13 10:00

編集2022/12/14 00:19

前提

とある管理画面を作成するのですが、ハタと「どうテーブル設計すればいいのか?」と悩んでおり、ご助言をいただきたいです。

実現したいこと

  • 一人のユーザーに対し、属性や家計情報を登録します。
  • 属性は、氏名や性別など一般的なものです。
  • 家計情報がネックとなっています。
  • 家計情報は月ごとの収入と支出です。
  • 収入と支出は可変個登録です。
  • 最終的に、ユーザーごとの支出の集計表を出力します。

検討内容

登録するものの個数が固定であれば、ユーザーテーブルに登録するもののカラムを用意して値を入れればいいのですが、可変個登録のため、テーブルは分ける必要があると思っています。

ユーザー
ID
氏名
性別
年齢
収入
ユーザーID
収入名
金額
支出
ユーザーID
支出名
金額

のようにテーブルを作成したとすると、出来上がるデータは

ID氏名性別年齢
1ユーザーA30
2ユーザーB27
ユーザーID収入名金額
1月収300000
1臨時収入A20000
2月収250000
2臨時収入A15000
2臨時収入B10000
ユーザーID支出名金額
1家賃60000
1光熱費15000
1交際費20000
1ローン30000
2家賃60000
2光熱費15000
2交際費20000

のようなものになります。

発生している問題

支出の集計表はユーザーごとに分かれおり、

月収
臨時収入A
収入計
家賃
光熱費
交際費
ローン
支出計

という形です。

実際はもう少し複雑ですが、要点だけに絞るため簡略化しています。

どうSQLを組んだものかと悩んでおり、テーブル構成が妥当かどうかを含め、アドバイスを頂ければと思います。Laravelを使用します。

よろしくお願いします。

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

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

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

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

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

avantgarden

2022/12/14 00:19

ご指摘ありがとうございます。 質問タグを調整しました。
guest

回答3

0

収入・支出テーブルは支出をマイナス表示にすれば1つにまとめられそうですね
あとは日付を埋め込んで、可能であれば集計単位である月単位の生成列などを用意しておくと効果的です

投稿2022/12/13 10:27

yambejp

総合スコア114835

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

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

avantgarden

2022/12/14 00:22

ありがとうございます。 DB側で集計情報を持つことも検討いたします。
guest

0

ユーザID:1 のその月の収入を出すなら、  select sum(金額) from 収入 where ユーザID=1 and 日付=... ユーザID:1 のその月の支出を出すなら、  select sum(金額) from 支出 where ユーザID=1 and 日付=... ユーザID:1 のその月の収支を出すなら、  ↑の 収入 から 支出 を引く ユーザID:1 のその月の収入を収入名単位で出すなら、  select sum(金額), 収入名 from 収入 where ユーザID=1 and 日付=... group by 収入名 その月の家賃がゼロでも 家賃: 0 と出したいなら、  select sum(支出.金額), 支出集計表.支出名 from 支出集計表   left join 支出 on 支出.支出名=支出集計表.支出名 where 支出.ユーザID=1 and 支出.日付=... group by 支出集計表.支出名

とかいう感じでしょうか。

わたしなら支出と収入は 1テーブルにまとめます。

投稿2022/12/13 11:19

68user

総合スコア2005

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

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

68user

2022/12/13 11:25

と思いましたが、「支出の集計表」ってのはそういうテーブルがあるわけではなく出力画面イメージでしたかね。 そういうテーブルを作っておいた方がよい気がしますが要件次第ですね (例えば全ユーザの食費の集計をするのであれば作っておいた方がよいかも)
avantgarden

2022/12/14 00:20

ありがとうございます。 集計表に関しては仰る通りで、テーブルではなく画面出力のイメージです。 集計テーブルについても参考にさせていただきます。
guest

0

ベストアンサー

収入/支出テーブルにあと日付があれば成り立つんじゃないでしょうか

投稿2022/12/13 10:13

yuma.inaura

総合スコア1453

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

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

avantgarden

2022/12/13 10:59

ありがとうございます。このテーブル構成で集計表のような形で出力するには、ユーザーテーブルに収入/支出テーブルを結合して、group_concatを用いるなどして1行取得→PHPで加工という方法が思いつくのですが、それがベターな方法かどうかお伺いしたいです。
yuma.inaura

2022/12/13 12:06

良いんじゃないでしょうか クエリの負荷問題が生じるようなら集計結果のテーブルを別途作成する方法もありますね
avantgarden

2022/12/14 00:23

集計テーブルに関しては検討しようと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問