アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

現在商品のデータベースを作っているのですが、商品とそのカテゴリをデータベース上でそれぞれ別のテーブルにて保存しています。

【商品】
番号  商品名  カテゴリ
1     パソコン   1
2    洗濯機    2
3    車      3

【カテゴリ】
番号 カテゴリ名
1 OA機器
2   家電
3   大型


カテゴリ数が200ほどあり、毎回ページを読み込ませる際に、カテゴリ名を表示させるためにカテゴリテーブルのすべてのデータをSELECTで抽出し、

$category[1] = "OA機器";
$category[2] = "家電";
$category[3] = "大型";


というように配列に入れた後、カテゴリ名を表示させているのですが毎回ページ移動をするたびに再読み込みが必要なため、メモリを無駄に消費してしまっているように思えます。

そこで質問です。

・毎回のロードをやめSESSIONなど一時的に入れたほうがレスポンスは良いのでしょうか?
・または手動にはなりますがデータベースをやめて、カテゴリだけで一つファイルを作りその中に上記の配列を記述し、requireなどで読み込む方が良いのでしょうか?

上記のカテゴリ分類以外にも「色」や「大きさ」などでも細かく分類したく、頭を抱えています。


よいカテゴリ分岐方法等ありましたらご教授いただけると幸いです。

どうぞよろしくお願い致します。

A 回答 (3件)

>毎回ページ移動をするたびに再読み込みが必要なため、メモリを無駄に消費してしまっているように思えます。



まぁカテゴリ一覧の表示ページ以外で「全部のカテゴリ名」を取ってくるのは無駄でしょうね。商品と結合させてカテゴリを取ってくれば、その商品を表示するときに必要なカテゴリ名は(商品と同時に)取ってこれますから。何のためにデータベースを使っているのかという話になります。


>カテゴリ2つにまたがる場合があり、そのカテゴリIDは「1,2」というようにカンマ区切りでデータを格納しています。

設計からやり直した方が(結果的に)いいと思います。

単純に使うだけの文字列なら取得後に分割したりも何てことはありませんが、他のテーブルと関連付けるものをそういう格納をしてはダメです。最大いくつのカテゴリに属するようにするかを決めてその数のカテゴリID列を持つべき(2つめ以降、空きの場合はNULLを許可する)。
    • good
    • 0

・毎回のロードをやめ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));
    • good
    • 0

SQLでJOIN使うのが一番楽。

この回答への補足

早速回答ありがとう御座いました。
先ほどJOINで試したところ処理速度も大変早く問題なく実装できそうです。

ただ一点、カテゴリ2つにまたがる場合があり、そのカテゴリIDは「1,2」というようにカンマ区切りでデータを格納しています。

この時カテゴリID1,2の「OA機器」「家電」の2つのカテゴリを同時にもってくることは可能でしょうか?

補足日時:2013/12/02 07:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!