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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

データベース設計

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

Q&A

解決済

1回答

593閲覧

[Django]モデル(DB構造)をどのようにしたらいいのかわからない

RyuSA

総合スコア131

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

データベース設計

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

0グッド

0クリップ

投稿2018/02/16 01:58

お世話になっています。
アプリを開発しているのですが、テーブルの設計についてご意見をお聞かせください。

アプリの内容としては、外部サービスの情報を本アプリに入力し、外部サービスにかかる費用を計算する簡単なものです。が、その外部サービスの情報の中の一部に可変なデータが存在します。
その可変データをどのように保存していくのが良けばいいのか、詰まってしまってます。

入力情報

・外部サービスの識別番号
・費用
・外部サービスでのオプション(オプション名・計算方法) ← 可変量

以上の3つの入力から費用を算出します。

外部サービスのオプションについて

ひとつの識別番号について、複数のオプションを付与されています。ただし付与できるオプションの個数は不明(3個のオプション付与の場合もあれば10個のオプションが付与されることも)
計算方法自体は事前にわかっている3種類のいずれかです。

現在の実装状況

今のところ、modelを以下のように実装しています。
optionsはオプション全体をjson化し、TextFieldに保存しています。

python

1class Report(models.Model): 2 # 識別番号 ユニークなものにする 3 identification = models.CharField(max_length=20, unique=True) 4 # 費用 5 price = models.IntegerField(default=0) 6 # 外部サービスのオプション 7 # json形式でオプションを保存し、json.dumpで読み込む……予定 8 options = models.TextField() 9 10# optionsの例 11# これをstr化して保存してます…… 12options = { 13 "option_name" : { 14 "method" : "method1", 15 "const" : xx, 16 "maximum" : yy, 17 }, 18 "option_hoge" : { 19 "method" : "method2", 20 "minimum" : zz, 21 }, 22 "option_huga" : { 23 "method" : "method1", 24 "const" : xy, 25 "maximum" : yz, 26 }, 27 "option_tomato" : { 28 "method" : "method3", 29 "const" : a, 30 }, 31 ... 32}

修正したい部分

自分自身データベース初心者故、このような可変個数データをどのように扱えばいいのかわかりません……が、少なくとも現状のjson保存はやってはいけないパターンだと思っています。(柔軟性がない)
テーブルの設定方法として、良い方法はありませんか?よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。
もちろん要件によりますが、私は可変の値に関しては専用の子テーブルをよく作ります。
今回であれば、親のreportsテーブルのIDを外部キーにしたreport_optionsテーブルのようなものを作りますね。

参考になれば幸いです。

投稿2018/02/19 03:29

y_ahiru

総合スコア50

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問