- ベストアンサー
商品データベースのカテゴリ表示方法について
- 商品データベースのカテゴリ表示において、ユーザビリティとパフォーマンスの向上を考慮した方法を検討しています。
- 現在、カテゴリテーブルのデータをSELECTして配列に格納し、ページ移動ごとに再読み込みしていますが、メモリの無駄遣いとなっています。
- 代わりに、SESSIONを使用した一時的な保存やカテゴリ情報をファイルに保存してrequireで読み込むなどの方法を検討しています。カテゴリ分岐方法についてもアドバイスをいただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>毎回ページ移動をするたびに再読み込みが必要なため、メモリを無駄に消費してしまっているように思えます。 まぁカテゴリ一覧の表示ページ以外で「全部のカテゴリ名」を取ってくるのは無駄でしょうね。商品と結合させてカテゴリを取ってくれば、その商品を表示するときに必要なカテゴリ名は(商品と同時に)取ってこれますから。何のためにデータベースを使っているのかという話になります。 >カテゴリ2つにまたがる場合があり、そのカテゴリIDは「1,2」というようにカンマ区切りでデータを格納しています。 設計からやり直した方が(結果的に)いいと思います。 単純に使うだけの文字列なら取得後に分割したりも何てことはありませんが、他のテーブルと関連付けるものをそういう格納をしてはダメです。最大いくつのカテゴリに属するようにするかを決めてその数のカテゴリID列を持つべき(2つめ以降、空きの場合はNULLを許可する)。
その他の回答 (2)
・毎回のロードをやめSESSIONなど一時的に入れたほうがレスポンスは良いのでしょうか? 確かにレスポンスは "多少は" 向上すると思いますが、セッションに入れるのは「user_id」のような個人識別に必要な最低限の情報だけに限定したほうが、データベースの役割としては合っています。一時的にセッションにキャッシュを作るような状態だと、データベース側で変更が行われたときにそれを検知してセッションに代入しなおすという面倒なステップが増加します。それを実装する気があるならばセッションに他のデータを入れちゃってもいいとは思いますが・・・ カテゴリを "たった" 200件SELECTするだけでそんなに時間かかりますかね?5000件とかなら遅くなることも考慮すべきだと思いますが、200件ってそんなに多い数字ではないような。 ・または手動にはなりますがデータベースをやめて、カテゴリだけで一つファイルを作りその中に上記の配列を記述し、requireなどで読み込む方が良いのでしょうか? PHPファイルからデータベースに切り替えることはあると思いますが、逆にするメリットはほとんどないでしょう。 PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 FIND_IN_SET http://c-brains.jp/blog/wsg/10/05/17-175025.php $targets = array(1, 2); // 選択するカテゴリ $sql = 'SELECT * FROM goods'; if ($targets) { $wheres = array_fill(0, count($targets), 'FIND_IN_SET(?, category)'); $sql .= ' WHERE ' . implode(' OR ', $wheres); $stmt = $pdo->prepare($sql); $stmt->execute($targets); } else { $stmt = $pdo->prepare($sql); $stmt->execute(); } print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
- kosukejlampnet
- ベストアンサー率44% (126/282)
SQLでJOIN使うのが一番楽。
補足
早速回答ありがとう御座いました。 先ほどJOINで試したところ処理速度も大変早く問題なく実装できそうです。 ただ一点、カテゴリ2つにまたがる場合があり、そのカテゴリIDは「1,2」というようにカンマ区切りでデータを格納しています。 この時カテゴリID1,2の「OA機器」「家電」の2つのカテゴリを同時にもってくることは可能でしょうか?