MySQL でのデータベース設計について相談です。 一言でいうと、配列データをシリアライズしてDBに登録することの是非について伺いたいです。

補足

将来的に、itemを基準としてどのuserに選択されているかを取得して一覧表示するようなこともやりたいので、それに対する適正の高い方法も知りたいです。

MySQL | PHP173閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

1

1人がナイス!しています

回答ありがとうございます! 一般的なやり方を覚えたいので、やはり別テーブルに各ユーザーの各itemごとに選択を登録してくのが良さそうですね。 しかし今現在の設計を活かすならJSON型はかなり現実的に見えます。こちらも検討したいと思います。 実を言うと今回相談した箇所とは別に、多次元配列をガッツリ使ってしまっている部分もありまして(そっちは手に負えないのでそのまま行こうと思っていた)、JSON型に変更するとだいぶ便利になりそうです。

その他の回答(4件)

1

user_item_tbl 別のtableを用意 user_idとitem_idのカラムを作成 主キーはauto_increment insertとdeleteで増やしたり減らしたりする JOINで連結して抽出 リレーションIDとなるカラムはインデックス忘れずに。重くなるから。

1人がナイス!しています

1

リレーショナルデータベース(RDB)の第一正規化に「繰り返しの排除」が有ります。つまり、配列は排除すると言う事ですので、 テーブル[user_list] user_id item_id として、選択されたデータ分の行で持つ方法が一般的な方法です。

1人がナイス!しています

回答ありがとうございます! 正規化に疎い私には繰り返しが見えないのですが、どこが繰り返しに該当するのでしょうか。 例えば user_id:1のユーザーが1,2,3を持っていて user_id:2のユーザーが2,3,4を持っている場合に 2や3が繰り返し現れているのが不当ということでしょうか? また例示いただいた テーブル[user_list] user_id item_id の item_id にはどのような値が入ることが想定されますでしょうか?

1

RDBというのは、特定のプログラミング言語に依存しないというのが、原則ですから、PHP以外では読み書きできないデータベースというのは好ましくありません。それに、データベースの正規化をおこなっているまとも設計であれば、第一正規形にする時点で、配列は子テーブルとして外だしされます。 パフォーマンスを重視して、正規化崩しをするのであれば、MySQLにはSETデータ型がありますので、配列はSET型のカラムに格納するのが良いでしょう。そうすれば、PHPに依存しないデータベースが構築できます。

1人がナイス!しています

1

格納するのが提示されたソースのように「整数値」だけなら、カンマ区切りにする方が手っ取り早い(&無駄がない)のでは? $selected_items = Array(4,9,13); $selected_items_s = implode(',', $selected_items); 使うときには explode(',', $selected_items_s) で配列に戻せばいいでしょう。 整数値だけなら(文字列データと違って区切り文字が混入する心配がないなら)implode/explode が楽だと思いますし、phpが整数と文字列を適切に相互変換してくれるのを活用しない手はありません。

1人がナイス!しています