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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1271閲覧

ユーザーごとに数の違うデータの保存、テーブルの設計について。

mashiroyuya

総合スコア24

Django

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/08/18 05:42

編集2018/08/18 05:43

現在Djangoをつかってwebアプリを作っている途中なのですが、以下の状況で質問をしたいです(Djangoに関係なくテーブル設計の仕方についても質問があるのでそこだけでもよろしくお願いします)。

アプリのデータとして、ユーザーが読んだ本を入力してもらいたいのですが、現状は入力フォームが、

読んだ本の数 _ 冊

とまず入力するところがあって入れた数だけ

◯ ジャンル ____

◯ 読んだ時期 ___ 月

という入力フォームが冊数分出てくるという風になっています。

ここでこの入力フォームに入力されたデータをデータベースに保存したいのですが、今は次のように考えて保存しようとしています。

  • キー : ユーザーID, 整数
  • 読んだデータ : '(ジャンルA, 5月), (ジャンルB, 7月)', 文字列

といった感じで読んだ本のリストを文字列にして保存しようとしています。
つまり、ユーザーの入力したいくつかの本のデータをまとめて文字列にして1つのデータとして保存しようと考えています。

ここで以下の質問をしたいです。

  • そもそもデータベースのテーブルの設計の仕方(文字列にして1つに押し込んでしまう)でいいのか。こういうユーザーによってデータの量が変わる場合はどうしたらいいのか。
  • もし上記の設計にしたとして、入力フォームでバラバラに入っているデータをDjangoの汎用ビューで保存できるのでしょうか(CreateViewを使おうとしましたが、素のCreateViewだとそ入力フォームのままバラバラに保存してしまいます)。

また、上記では本にしていますが、実際は本ではなく、データの性質として、
ユーザー1 に対して 複数の (選択肢から選ばれるデータ, 整数) といった形のデータが紐づくものとなっています(データの数は多くても10程度です)。上では本を例にして質問を書きました。

拙い内容で申し訳ないのですが、2つの質問のうちどちらかで良いので、ご教授よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Djangoには詳しくないのでテーブル設計について。

テーブル設計に絶対の正解というものはありませんが、私ならこうします。

冊数テーブル ( ユーザID 整数 PRIMARY KEY, 冊数 数値 ) 読書詳細テーブル ( ユーザID 整数 PRIMARY KEY, 連番 整数 PRIMARY KEY, ジャンル 文字列, 読んだ時期 整数 )

読書詳細テーブル.連番は、1ユーザが複数の本を登録した場合に1, 2, 3, ... と連番を振ってキーにします。
ジャンルが手入力じゃなく選択式なのだとしたら、ジャンルマスタテーブルも作ってジャンルCDで紐づけるような感じです。
また、場合によっては冊数テーブルはなくてもいいです。

入力フォームが冊数分出てくる

ということなので、これがもしすべて必須入力なのだとしたら読書詳細テーブル.ユーザIDをキーにしてcountを取得すれば冊数が取得できます。(任意入力なのだとしたら冊数は別で保存する必要がありますが)

テーブル設計は、システムに必要になるデータを全部洗い出し、「正規化」していくことで整理していきます。
「正規化」にも第一から第三までレベルがあり、どのレベルまで正規化して設計するかはどういう使い方をしたいかで変わってきます。
絶対に第三正規形にしなければならないというわけではありませんし、そこまで極端にやると正直とても使いづらいデータベースになることも多いです。

ただ、ひとつ言えることは、複数の文字列を連結して1カラムに詰め込み、使うときはまたバラして使うというのは、あまりオススメしません。

投稿2018/08/18 07:00

編集2018/08/18 07:00
spookybird

総合スコア1803

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

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

0

キー : ユーザーID, 整数
読んだデータ : '(ジャンルA, 5月), (ジャンルB, 7月)', 文字列

正規化の観点からだと配列は持たない方が良いということになります。
ですが、RDBだと資源的にキー部分のデータが配列数分増えることになります。

配列を扱う事が得意(配列に対して高速に検索可能)なDBMSや、取得してから配列を分解する用途しかない場合は、配列にしておいた方が高速です。
また、RDBではなくNoSQLタイプのDBにするのも選択肢の一つです。

postgresで、キー部分で1億4千万件、配列部分を展開し正規化したもので8億件という状態で、
データは配列で取り出すときに正規化という方法の方が格段に高速になった経験があります。
工夫は必要でしたけどね。

投稿2018/08/18 22:07

sazi

総合スコア25138

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問