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

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

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

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

データベース

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

データベース設計

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

4回答

1599閲覧

DB設計、正規化について

yamauchi

総合スコア12

Ruby on Rails 5

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

データベース

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

データベース設計

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2019/01/16 13:56

編集2019/01/21 17:48

DB設計、正規化について

.
railsでDB設計をしています。
チェックボックスを用いて、複数条件検索を実装しようと思っています。

Postモデルに投稿してもらった情報を保存するのですが、
Post,Grade,State,Departmentの4つmodelがあります。

Grade:対象の学年
State:対象の状態
Department:対象の学部
と定義しており、それぞれに3〜8程度の情報が入る予定です。

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

Post model
|ID|userID|grade|state|department|
|:--|:--:|--:|
|1|user1|"学部1年","学部2年","学部3年"|"ふやけている","折り目がある"|"文化学部","国際文化学部","理学部|
|2|user2|学部2年|"新品"|"文化学部”,"国文学部"|
|3|user3|学部3年|"ふやけている","書き込みをしている"|"文化学部","情報科学部"|

この状態で、第一正規化を行うと、

Post model
|ID|userId|grade|state|department|
|:--|:--:|--:|
|1|user1|"学部1年"|"ふやけている"|"文化学部"|
|2|user1|"学部1年"|"ふやけている"|"国際文化学部"|
|3|user1|"学部1年"|"ふやけている"|"理学部"|
|4|user1|"学部1年"|"折り目がある"|"文化学部"|
|5|user1|"学部1年"|"折り目がある"|"国際文化学部"|
|6|user1|"学部1年"|"折り目がある"|"理学部"|
|7|user1|"学部2年"|"ふやけている"|"文化学部"|
|8|user1|"学部2年"|"ふやけている"|"国際文化学部"|
|9|user1|"学部2年"|"ふやけている"|"理学部"|
|10|user1|"学部2年"|"折り目がある"|"文化学部"|
|11|user1|"学部2年"|"折り目がある"|"国際文化学部"|
|12|user1|"学部2年"|"折り目がある"|"理学部"|
|13|user1|"学部3年"|"ふやけている"|"文化学部"|
|14|user1|"学部3年"|"ふやけている"|"国際文化学部"|
|15|user1|"学部3年"|"ふやけている"|"理学部"|
|16|user1|"学部3年"|"折り目がある"|"文化学部"|
|17|user1|"学部3年"|"折り目がある"|"国際文化学部"|
|18|user1|"学部3年"|"折り目がある"|"理学部"|
|19|user2|"学部2年"|"新品"|"文化学部"|
|20|user2|"学部2年"|"新品"|"国際文化学部"|
|21|user3|"学部3年"|"ふやけている"|"文化学部"|
|22|user3|"学部3年"|"ふやけている"|"情報科学部"|
|23|user3|"学部3年"|"書き込みをしている"|"文化学部"|
|24|user3|"学部3年"|"書き込みをしている"|"情報科学部"|

と、たった3つのデータで24つもデータができてしましました。
実際に動かすチェックボックスはもっと多いので、この実装方法でいいのか迷っています。
これがDBの在り方なのか、配列で保存して運用していくのか、もしくは、他にもっとやり方があるのか、わからないため回答をお願いいたします。

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

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

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

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

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

yambejp

2019/01/17 05:30

ちなみに正規表現と正規化はまったくの別物なのでタグを外したほうがよいです
guest

回答4

0

項目間に関係が無いのなら、(userID, grade)、(userID, state)、(userID, department)の3テーブル作るのでは?

投稿2019/01/16 14:26

otn

総合スコア84423

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

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

0

同じ user1 さんが学部1年であり、学部2年でもあり、学部3年でもあり、文化学部、国際文化学部、理学部の3つの学部に属する、って通常の学校では考えにくいですが?

この状態で、第一正規化を行うと、

出典は?質問に参照したURLや書籍も追記してください。

-- テーブル定義 User User_ID User_NAME 1 user1 2 user2 3 user3 Grade:対象の学年 Grade_ID Grade_NAME 1 学部1年 2 学部2年 3 学部3年 State:対象の状態 State_ID State_NAME 1 ふやけている 2 折り目がある 3 新品 4 書き込みをしている Department:対象の学部 Department_ID Department_NAME 1 文化学部 2 国際文化学部 3 理学部 -- 以下、テーブルを追加 User_Grade User_ID Grade_ID User_State User_ID State_ID User_Department User_ID Department_ID

でJOINを使うことでPost modelのSELECT結果を得られるかと。

投稿2019/01/16 14:28

Orlofsky

総合スコア16415

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

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

yamauchi

2019/01/16 14:35

質問の仕方が悪かったです、すみません。 今回は、教科書に関してのサービス作ってるんですけど、 1つの教科書に対して、{"一般教養","理学部","情報理工学部"}みたいに、複数の学部の人が対象になる形なので、 grades,states,facultiesがそれぞれ複数ある形になります。 このPost modelは、教科書の情報が入ってるため、 その教科書を投稿した人のUserIDが入っています!
yamauchi

2019/01/16 14:42

faculties→departmentです。 失礼しました。
guest

0

たとえばこう

  • マスターテーブル

SQL

1create table user(uid int primary key,uname varchar(20)); 2create table grade(gid int primary key,gname varchar(20)); 3create table state(sid int primary key,sname varchar(20)); 4create table department(did int primary key,dname varchar(20)); 5insert into user values(1,'user1'),(2,'user2'),(3,'user3'); 6insert into grade values(1001,'学部1年'),(1002,'学部2年'),(1003,'学部3年'); 7insert into state values(2001,'ふやけている'),(2002,'折り目がある'),(2003,'新品'),(2004,'書き込みをしている'); 8insert into department values(3001,'文化学部'),(3002,'国際文化学部'),(3003,'理学部'),(3004,'国文学部'),(3005,'情報科学部'); 9
  • データテーブル

SQL

1create table post(pid int primary key,uid int,xid int,tbl varchar(10)); 2insert into post values 3( 1,1,1001,'g'), 4( 2,1,1002,'g'), 5( 3,1,1003,'g'), 6( 4,1,2001,'s'), 7( 5,1,2002,'s'), 8( 6,1,3001,'d'), 9( 7,1,3002,'d'), 10( 8,1,3003,'d'), 11( 9,2,1002,'g'), 12(10,2,2003,'s'), 13(11,2,3001,'d'), 14(12,2,3004,'d'), 15(13,3,1003,'g'), 16(14,3,2001,'s'), 17(15,3,2004,'s'), 18(16,3,3001,'d'), 19(17,3,3005,'d'); 20
  • 集計

SQL

1select t1.uid 2,uname 3,group_concat(gname) as grade 4,group_concat(sname) as state 5,group_concat(dname) as department 6from post as t1 7inner join user as t2 on t1.uid=t2.uid 8left join grade as t3 on t1.xid=t3.gid and t1.tbl='g' 9left join state as t4 on t1.xid=t4.sid and t1.tbl='s' 10left join department as t5 on t1.xid=t5.did and t1.tbl='d' 11group by uid;

投稿2019/01/17 08:22

yambejp

総合スコア114585

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

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

0

自己解決

Bookテーブルを新しく作り、それぞれの{title,user_id,state,grade,department}columnに対してstates,grades,departmentsテーブルを紐づけて第三正規系まで持っていくのが一番いいと判断しました。
データ数が多くなりすぎるし、SQLもめんどくさくなるから心配だったのですが、
Bookとstates,grades,departmentの親子関係を作って実装するのが良さそうです。

質問の仕方が悪かったです、申し訳ありません。
https://teratail.com/questions/10017

投稿2019/01/16 15:03

yamauchi

総合スコア12

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

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

sazi

2019/01/17 01:19

別テーブルにすると当然コストは上がります。 JSON型や配列も検討してみては如何でしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問