人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

RDBMSの実践的な使い方についての質問です。
例えば会員制のサービスで、ユーザの好物のリスト(任意の文字列のリスト。例['リンゴ','バナナ','ヨールグト'])を会員テーブルのあるカラムに保存するとしたら、どのようにするのが最も望ましいでしょうか。

* RDBMSの配列データ型を使う
* アプリ側で配列をシリアライズして、それをDBに保存
* 複数行テキストとして保存(改行コードで区切る)
* JSONとして保存( "['リンゴ','バナナ','ヨールグト']")
* 1カラムに押し込もうとすることが間違い
などなど。

【前提条件】
* このサービスの利用者数・アクセス数は多くなく、負荷やテーブルサイズを気にしなくてよい(会員レコード数千件程度)
* 好物リストはユーザによる自由記述

●質問者: DQNEO
●カテゴリ:コンピュータ インターネット
✍キーワード:dB JSON RDBMS アクセス数 アプリ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● a-kuma3
●30ポイント

「1カラムに押し込もうとすることが間違い」のスタンスです。

前提は、往々にして変わるので、よっぽどのことがなければ、素性が良い設計をすべきです。

ということで、「好物DB」を作って、[利用者ID,好物] というテーブルを作る方を推します。

◎質問者からの返答

正論ですね。

教科書的に間違いな気はするのですが、別に困らないのでいいじゃないかという気もします。


2 ● deflation
●30ポイント

正規化の観点から考えると、会員テーブルに入れるのは間違いです。


会員番号でリンクを張って、たとえば以下のような「ユーザーの好物テーブル」を作成するのが定石です。


会員番号好物
001リンゴ
002ヨーグルト
002リンゴ
003バナナ

また、好物の“文字ゆらぎ”を抑制するために(たとえば、リンゴ,りんご,林檎のような文字ゆらぎが発生しないようにするために)、「好物マスター」を用意してコード化(シリアライズ)することも必要かもしれません。

◎質問者からの返答

正規化の観点からすると間違いはおっしゃるとおりですね。

別に正規化しなくてもいいじゃないかという気もしました。


3 ● きゃづみぃ
●30ポイント

私も

>* 1カラムに押し込もうとすることが間違い

だとは 思いますが、使い方によっては そのようなやり方もあります。


●二進数で考える


'リンゴ','バナナ','ヨールグト'を 好物だったら 1 そうでなかったら 0としてあらわします。

たとえば バナナが好物で ほかが 好物でない場合は

010

となります。


このようにしておけば

001 ヨーグルトが好物

010 バナナが好物

011 バナナとヨーグルトが好物

100 リンゴが好物

101 リンゴとヨーグルトが好物

110 リンゴとバナナが好物

111 リンゴとバナナとヨーグルトが好物

で それらを 10進数にすれば 0から7までの値となります。

つまり ひとつの項目に 0から7の値で 何が好物かセットできるのです。

このメリットは データベースの容量を減らせることです。

ま、今回は あまり関係ないと思いますが。

わかりにくい というデメリットもあります。

ただ こういうやり方もありますよ ということで 知っておくと 何かの役に立つ・・・かも?!

◎質問者からの返答

好物が最大3種類ならそのとおりですね。

2進数保存という発想はなかったので斬新です!


4 ● SweetSmile1978
●30ポイント

たとえば、好物で友達になれそうな登録者を探せるサービスとか

提供するのならほかの方が言うように別テーブルに一つずつ対応づけてのほうが

いいような気もしますが、そういうことをしないのであれば、

わざわざテーブル分ける必要もないかなという気もします。

まぁ、フルテキスト検索とかできるのなら

いずれにしてもテーブル分ける必要はないかもしれません。

そのデータをどう使うかという情報があったほうがいいように思います。

◎質問者からの返答

「まぁ、フルテキスト検索とかできるのなら

いずれにしてもテーブル分ける必要はないかもしれません。」

ありがとうございます。

用途によっては、テーブル分ける必要ないということですね。


5 ● hanako393
●80ポイント ベストアンサー

通常は、1カラムに押し込もうとすることが間違いです。

この質問にはこう答えるしかありません。

ただし状況によって違います。

> RDBMSの配列データ型を使う

> アプリ側で配列をシリアライズして、それをDBに保存

> 複数行テキストとして保存(改行コードで区切る)

> JSONとして保存( "['リンゴ','バナナ','ヨールグト']")

・好物リストをほかどのように今後利用する可能性があるか?

・DB単体での保守性

・プログラムからのアクセスのしやすさ

・性能

このあたりを考慮して選べばよいと思います。

妥当な理由があれば、どれでも問題ないと思います。

質問に挙がっている内容は、どこかのシステムで使われている手法ですから

どれも悪いわけではないです。

個人的には1カラムに入れるのは気持ち悪いですが、今回の場合は何も問題にならないですし、1カラムに入れたほうがわかりやすい可能性もあります。

好物リストは確かにリスト形式ですが、単なる自己紹介と変わらない扱いだと思いますから。

◎質問者からの返答

・好物リスを今後どう利用するかによって選べばよい。

・1カラムに入れるのは気持ち悪いが、今回の場合は問題にない。1カラムの方がわかりやすい可能性もあります。

・好物リストは確かにリスト形式だが、自己紹介と変わらない

なるほど!

1カラム方式にしようと思っていたので、勇気がわいてきました。

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ