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

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

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

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

2回答

1673閲覧

数が決まっていない要素のRDSの扱い

kazu_koji

総合スコア11

Amazon RDS

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

1グッド

1クリップ

投稿2019/07/04 13:54

編集2019/07/05 23:23

下記のような一つの項目に対して一定ではない個数の項目について考えています。
(正規化についてはなんとなく理解しています。)
イメージ説明
(ぐるなびより転載)

実装方法として私が考えているのは以下の3つなのですが、どれがよいのでしょうか。
(bookひとつにつき複数のtagidが割り当てられており、別途tab tableがあることを仮定しています。)
tag table

tagidtagname
1ミステリー
2自己啓発
中略
12子供向け
13本屋大賞受賞

1. カンマ(,)などで区切る

book table

bookidnametag
100RDS入門1, 3, 8

とってきたデータを,で区切れば配列が得られるので、実装としてはなんとかなりますが、なんとなく気持ち悪いです。

2. 多めにカラムを取っておいて埋める

book table
|bookid|name|tag1|tag2|tag3|tag4|tag5|tag6|
|:--|:--:|:--:|:--:|:--:|:--:|--:|
|100|RDS入門|1|3|8||||

わかりやすいのですが、増やしたくなった場合大変そうです。

3. 別にBook tag tableを作る

book table

bookidname
100RDS入門

book tag table

book_tagidbookidtagid
100011001
100021002
100081008

ユニークなidとしてBookid+tagidを設定してみました。
個人的にはこちらがきれいなのかなとは思うのですが、無意味なidを作ってしまうのはいかがなものなのでしょうか。

ご教示の程よろしくお願いします。

koiwa_510👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

SQLをシンプルにパフォーマンス良く実行できるように、[データベースのテーブルはデータベースの正規化 に沿って設計します。通常、第3正規化まで行います。第1正規化で繰り返し(今回は配列)を排除します。

ゆえに、1, 2 はあり得ません。

投稿2019/07/04 14:11

Orlofsky

総合スコア16415

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

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

kazu_koji

2019/07/04 20:46

ありがとうございます。 3の場合で、ユニークなidを追加する場合、 例のようにbookidとtagidをつなげたものでよいのでしょうか。
Orlofsky

2019/07/04 21:35

Bookidとtagidでユニークになるので、別のユニークなidは無用です。 それより、たとえ話にするにしても、[利用シーン]と[ミステリー]、[RDS入門]が結びつく質問を書けるよう努力をしてください。 泣きつかれて、あるシステムのテーブル設計を調べたことがあります。まったく正規化を理解できていない人であることは明らかで、この内容を手間隙かけて修正するより、最初から作り直した方が安く短時間で対応できます、で調査終了。
yambejp

2019/07/05 01:31

一応1についてはないことはないです。サンプルを別回答の方に上げておきました (不定数のものには必ずしも適さないですけどね)
kazu_koji

2019/07/05 23:41

Orlofskyさん ありがとうございます。 配慮が足りませんでした。。 yambejpさん ありがとうございます。
guest

0

MySQLの場合はJSON型のカラムがあるのでそれで管理する手はあります
ある程度までは検索性も担保されていますが、やはり中間テーブルを作ったほうが
高速に処理できます

カンマ区切りについては文字列として管理するのは重複などを考えるとよくないですが
set型で管理すればFIND_IN_SETを利用して処理することは可能です
ただしset型に予め上限数までダミーコードを与えておかないと
データが保持されるたびに拡張するのは良い管理とは言えません

sample

setを使ったMySQLの例
(あくまで参考、中間テーブルのほうが拡張性が高い)

SQL

1create table tag(tagid int primary key,tagname varchar(20)); 2insert into tag values 3(1,'ミステリー'), 4(2,'自己啓発'), 5(5,'子供向け'), 6(6,'本屋大賞受賞'); 7 8create table book (bookid int primary key,name varchar(100),tag set("1","2","3","4","5","6","7","8","9","10")); /*setのダミーいっぱい必要*/ 9insert ignore into book values 10(100,'RDS入門','1,5,5,6,100'); 11 /* 12重複があって一つにまとまる 13setにない値は切り捨てられる 14*/ 15 16select * from book as t1 inner join tag as t2 on FIND_IN_SET(t2.tagid,t1.tag);

投稿2019/07/05 01:13

編集2019/07/05 01:28
yambejp

総合スコア114839

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問