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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

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

データベース設計

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

Q&A

解決済

1回答

1799閲覧

【データベース設計】子モデルが複数の親モデルを持ってしまうことの解決方法を教えてください

rie1224

総合スコア5

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

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

データベース設計

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

0グッド

0クリップ

投稿2020/01/18 14:41

編集2020/01/19 03:53

前提・実現したいこと

railsで家計簿アプリを作成しています。
テーブル設計で以下問題が発生しているため、相談させてください。

①子モデル(budgets)が複数の親モデル(monthlies・categories)を持ってしまう。
(テーブル設計のアンチパターンになってしまう。)
②budgetsのインスタンスをmonthlies・categoriesの両方に関連づけて保存する方法がわからない。

①を解消すれば②も解消すると考えています。

発生している問題・エラーメッセージ

現在作成している家計簿アプリの中で、毎月の予算を作成する際、科目別にできるよう実装中です。 例えば、1月の予算として、食費は1万円、交際費は2万円と設定するイメージです。 そのために現在設定しているテーブルは以下の3つです。 monthlies(月予算テーブル) カラム  ・month(1月、2月) categories(支出の科目テーブル) カラム  ・name(食費・交際費) budgets(予算テーブル) カラム  ・price(支出金額)      ・category_id(どの科目の支出なのか把握するため)      ・monthries_id(どの月の予算なのか把握するため) budgetsにcategory_idカラムを持たせることで、金額と科目を関連づけ、 それをmonthliesのインスタンスにすれば良いと考えました。 fields_forを使用して、monthliesのインスタンスを作成する際にbudgetsも併せて保存できるようにしましたが、 そこからcategory_idを指定する方法がわかりません。 調べた結果、上記のようにbudgetsテーブルが複数の親モデルを持ってしまうのは、 アンチパターンなので避けるべきということがわかりました。どのように解消すべきかわかりません。 どなたか、教えていただけると幸いです。

試したこと

そもそも、テーブルが3つあることが誤りなのでは?と思い、monthliesとbudgetsを結合することを考えましたが、
うまくいきませんでした。
(月毎の予算表示する際、金額とカテゴリーの組み合わせをインスタンスとして持つテーブルがないとうまく表示できないため。)

補足情報(FW/ツールのバージョンなど)

参考にした記事
複数のテーブルに対して多対一で紐づくテーブルの設計アプローチ

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

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

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

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

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

rie1224

2020/01/19 03:53

ご指摘ありがとうございます。修正いたしました。
guest

回答1

0

ベストアンサー

現状の設計でもデータベース的には問題ないです。

リンク先(参考にした記事)の場合とは異なりますので、アンチパターンではありません。
リンク先は子テーブルのID(主キー)が複数の親に結び付く関係。

質問は、テーブルの外部キーで複数のテーブルと関連付ける設定。
データベースの設計では常用するものです。

ただ、monthlies が月の1カラムしかないのなら、予算テーブル に月フィールドを持たせてもいいかと思います。

投稿2020/01/19 00:15

編集2020/01/19 06:51
hatena19

総合スコア33699

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

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

rie1224

2020/01/19 05:02

ご回答ありがとうございます!! リンク先という概念を知りませんした。。 子テーブルのIDが複数の親に結び付く関係であれば、アンチパターンではないのですね。 今の設計でも問題ないとのことで、安心いたしました。 また、お手数ですが以下2点を追加で教えていただけますでしょうか。 ①現状のまま3テーブルを維持する場合  budgetsにmonthlies・categoriesの両方の外部キーを一度で設定するには、  どのようにすれば良いでしょうか。  ##試したこと  monthliesのnewのビューで、fields_forを使用してbudgetsも保存できるよう実装しました。  ##行き詰まったこと  そのbudgetsにcategoriy(支出の科目)を付け加える方法がどうしてもわかりませんでした。   ②budgets(予算テーブル)に月カラムを持たせた場合  以下、仕様を実現する方法はありますでしょうか。  ・月毎の予算の概要(1月の予算10万円、2月の予算15万円等)を表示する。  ・予算概要ページのリンクから、予算の内訳ページにとび、単月の予算の内訳を見る(1月の予算は食費が3万で、交際費が2万)  ##試したこと  ・budgetsのindexのビューで月毎の予算の概要を表示+showアクションへのリンクをはる。  ・showアクションで、単月の予算の内訳を見る。  ##行き詰まったこと   showアクションで見られるのは、budgetsのレコードとなるため、   単月の予算の内訳をみることはできないのでは?と思いました。
hatena19

2020/01/19 08:53 編集

書き方が悪かったのか、なんかいろいろ誤解があるようです。 「リンク先」というのかは質問内の「複数のテーブルに対して多対一で紐づくテーブルの設計アプローチ」へのリンクのことです。 リンク先のは「子テーブルのIDが複数の親に結び付く関係」でアンチパターンです。 質問のテーブル設計がアンチパターンでないということです。 Ruby on Railsについては私の管轄外ですので、分かりません。データベースとしてのテーブル設計に関しての回答ですので、Ruby on Railsでの実装に関しては他の人の回答をお待ちください。
rie1224

2020/01/19 06:00

再度のご回答と、初歩的な勘違いへの詳しいご説明ありがとうございます。 リンク先とは、参考記事のことですね。色々勘違いをしていました。 リンク先は「子テーブルのIDが複数の親に結び付く関係」 今回は、「子テーブルが複数の親テーブルに紐づく(子テーブルが複数の親テーブルを持つ)」 なので、全く異なるということですね。 やっと理解できました、ありがとうございます。 Ruby on Railsについては他の方の回答を待つことにします。 ご丁寧に説明してくださり、ありがとうございました!!
no1knows

2020/01/19 06:32

タイトルの質問は、hatena19さんが答えてくれて解決したようなのでベストアンサーで良いのではないでしょうか? もしRailsに関して2つの質問があるようでしたら、1つずつ質問を作成すると回答が得られやすくなるかと思います。 そういう運用をしていただいたほうが、後々、同じような問題で詰まった人たちが検索したときに有益な形になるかと思います。
rie1224

2020/01/19 08:51

おっしゃる通りですね!! そのようにさせていただきます。 アドバイスありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問