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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

953閲覧

1つのカラムに任意の数の値を入れる場合のテーブル構造について

kazutan

総合スコア12

SQL

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/01/07 17:33

初歩的な質問で、タイトル通りです。Railsでアプリを作っています。
例えば、Usersテーブルに「好きなスポーツ」というカラムを作り、その値は、サッカー、野球、バスケ、バレー、ラグビーの5つの中から任意の数だけ選べるとします。(値の登録時は、チェックボックスを使うことを想定しています。)

ーーUsersテーブルーー

id好きなスポーツ
1バスケ
2サッカー、バスケ
3野球、バレー、ラグビー

のように、一つのカラムに複数の値を「、」区切りで入れるのは望ましくなく、正規化しないといけないことはわかります。
これを正規化すると、SportsテーブルとUser_sportsテーブルを作り、

ーーSportsテーブルーー

idname
1サッカー
2野球
3バスケ
4バレー
5ラグビー

ーーUser_sportsテーブルーー

iduser_idsport_id
113
221
323
432
534
635

のようにすれば関係性は保たれています。しかし、たかがUserの一カラムのためにテーブルを2つも作るのは冗長な気がするのです。
あとは、Usersテーブルに好きなスポーツ1、好きなスポーツ2、・・・のようにカラムを複数作る方法もありますが、nullを入れることになりよろしくないと思います。
わざわざテーブルを2つ作ることがこの場合ふさわしいでしょうか?また、これら以外の方法があればご教授ください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、Sportsテーブルは選択肢を提示するものですので必要です
またスポーツ間で排他性がない(サッカー好きな人は必ず野球が嫌いではない)ため
User_sportsテーブルで関係性を保持する必要があります。
総じて感覚的に非効率と思っている方式が最も効率的な処理になります。

代替案として以下2方式考えられえますが

  • Usersテーブルに各スポーツをカラムとして持ち、booleanで判断
  • Usersテーブル好きなスポーツカラムを作りビット計算でデータを保持

前者は検索性は高いですが拡張性が乏しく、後者は単純に検索性が低いので
あまりおすすめできません

投稿2018/01/09 02:19

yambejp

総合スコア114814

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

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

kazutan

2018/01/09 17:53

解決しました。ありがとうございました!
guest

0

これを正規化すると、SportsテーブルとUser_sportsテーブルを作り

が正しいです。たとえば「バスケ」が好きな人をSELECTするSQLを正規化したテーブルと正規化ていないテーブルで記述して比べると良く理解できるかと。

投稿2018/01/07 21:20

Orlofsky

総合スコア16415

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

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

kazutan

2018/01/09 17:53

解決しました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問