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

PHP+MySQLでカテゴリ型の検索サイトを作成しようとしています。
それで、カテゴリの処理(DBへの格納方法)をどのようにすればスマートなのか、良かったらお知恵を貸して下さい。
カテゴリは増減するので、カテゴリテーブルとして別テーブルにします。
1つのサイトが複数のカテゴリに登録出来るようにします。

私は、1サイト1レコードのURLやサイト名を格納した登録サイトテーブルにカテゴリフィールドを作り、そこにカテゴリのIDをタブ区切りで入れようかと思ったのですが、これだとせっかくデータベースなのに効率が悪いような気がしています。

●質問者: wintarsnow
●カテゴリ:ウェブ制作
✍キーワード:DB MySQL PHP URL カテゴリ
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● kishiro
●17ポイント

http://www.asahi-is.co.jp/dcs002ter.htm

T字型ER手法

T字型ER手法を用いるのがよいと思います。

・カテゴリテーブル

・サイトテーブル

の他に

・カテゴリ/サイト 対照テーブル

を用意する事で、柔軟な構造になります。

◎質問者からの返答

回答ありがとうございます。

…む、難しいですね…。用語からさっぱりわかりませんでした…。「T字型ER手法」と「基礎」をキーワードに検索して基礎講座のサイトをみつけたので、勉強してみようと思います。


2 ● esseesse
●17ポイント

http://www.hatena.ne.jp/1094876903

SQLに関する質問です。 テーブルは3つあり、テーブル1とテーブル2はautoincrementなidをもち、テーブル3はそれらのidの対応表です。 テーブル2にinsertするときに同時にテ.. - 人力検索はてな

参考URLは私が以前した質問です。

私も似たようなものを設計しています。

私の場合は

・カテゴリのテーブル

・サイトのテーブル

・カテゴリとサイトのマッピングのテーブル

の3テーブルを用意しました。

カテゴリテーブルはautoincrementなidとカテゴリ名、親カテゴリのidの情報を保持します。(その他カテゴリに必要な情報も。)

サイトのテーブルもautoincrementなidとサイトの情報を保持します。

このテーブルにはこのサイトがどのカテゴリに属するかという情報は入っていません。

そして、カテゴリとサイトを関連付けるのが3つ目のテーブルで、カテゴリのidとサイトのidの2つがpkなフィールドを持ちます。

いろいろと設計は考えましたが、上記の設計が(自分の中では)データ量やアクセス速度ともによさそうと判断しました。

なお、参考URLの質問の趣旨は、この場合ではサイトのテーブルにinsertしたときに同時にマッピングのテーブルにinsertしないといけないんですが、サイトにinsertしたときのautoincrementなidをどうやってマッピングに反映させるのかということでした。

以上、参考になればと思います。

◎質問者からの返答

回答ありがとうございます。

すみません、「カテゴリのidとサイトのidの2つがpkなフィールド」というのは、主キーが2つ、ということなのでしょうか?? 文章の読解力に欠けていて申し訳なく…。

例えば、カテゴリテーブルが

id/categari

1/文学

2/スポーツ

3/コンピュータ

4/サークル

サイトテーブルが

id/sitename

1/べがるたふぁんくらぶ(カテゴリは2と4)

2/PHP入門(カテゴリは3)

3/読書サークル(カテゴリは1と4)

として、3つ目のテーブルはどのようになるのでしょうか。


3 ● kishiro
●17ポイント

http://www.bitscope.co.jp/tep/catalog_db2.1/catalog_db_frame.htm...

カタログ・データベースの構造

T字型ERなんですが、実際のテーブルを見ればすぐわかります。

いい例があるのでリンク先のテーブル定義を見てください。

・categories(カテゴリーテーブル)

・products_to_categories(カテゴリー・プロダクト対照テーブル)

・products(プロダクトテーブル)

カテゴリーとプロダクトを対照表で結び付けています。

このproductsの部分をサイトテーブルに置き換えれば

構造自体はそのまま使えます。

ちなみにこれは、PHPで組まれたECフレームワークの

テーブル定義なので、テーブル構造とかPHPのコード

とか参考になりますよ。

http://www.bitscope.co.jp/tep/

osCommerce サポート・ドキュメント - ECサイト構築システム

◎質問者からの返答

回答ありがとうございます。

なるほど、イメージがつかめてきました。

でもこの例だとproducts_to_categoriesでproductsのIDが主キーになっているから、1つのサイトに1つのカテゴリしか登録出来ませんよね? 主キーにしなければOKということで良いのでしょうか。


4 ● esseesse
●17ポイント

テーブル3は

cat_id/site_id(pk:cat_id,site_id)

として

1/3

2/1

3/2

4/1

4/3

とします。

pkをcat_idとsite_idの2つに設定しているのでcat_idとsite_idの両方が一致するエントリは存在しないことになります。

# 4/1と4/2や2/1はOKだけど、4/1があるともう一度4/1はinsertできない

◎質問者からの返答

回答ありがとうございます。

なるほど!

実は私、1つのテーブルに主キーは1つのフィールドにしか設定出来ないものとばかり思っていて、その為に今までの回答を読んでも「??」と首をかしげていたのですが、今試しにphpMyAdminで主キーを2つにして作ってみたら、…2つ作れました。

根本的な勉強不足でお恥ずかしいです。


5 ● upride
●16ポイント

1サイトを他カテゴリ登録はOKです

が、1サイト1レコードだけ登録ではなくマルチにするべきだと思います

カテゴリID , サイト名 ,サイトURL , 削除Flgやら・・

-------------------------------------------------

1 , サイトhoge ,

http://hoge.com

Hoge Lumber Company

, null・・

2 , サイトhoge ,

http://hoge.com

Hoge Lumber Company

, null・・

カテゴリが1でも2でも抽出で引っかかるし

サイト名やURLでの抽出でもカテゴリを列挙できます

例でいうと

カテゴリID / サイト名

1 / 読書サークル

2 / べがるたふぁんくらぶ

3 / PHP入門

4 / 読書サークル

4 / べがるたふぁんくらぶ

サイトIDを割り付けるかどうかですが・・

この場合ない方いい気もしますが・・好みですね

◎質問者からの返答

回答ありがとうございます。

この方法は処理が簡単で、私も考えたのですが、DBの正規化の観点から同じデータが複数あったらなるべく分けるべきなのかなぁと考えてしまいまして。でも抽出処理はこちらの方が速そうですよね。

うーん、データ量か、スピードか、どちらをとるかということになるのでしょうか。


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



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