PHP+MySQLでカテゴリ型の検索サイトを作成しようとしています。

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

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/09/19 18:32:19
  • 終了:--

回答(6件)

id:kishiro No.1

kishiro回答回数161ベストアンサー獲得回数42004/09/19 18:45:45

ポイント17pt

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

・カテゴリテーブル

・サイトテーブル

の他に

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

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

id:wintarsnow

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

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

2004/09/19 18:55:47
id:esseesse No.2

esseesse回答回数192ベストアンサー獲得回数02004/09/19 18:52:07

ポイント17pt

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:wintarsnow

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

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

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

id/categari

1/文学

2/スポーツ

3/コンピュータ

4/サークル

サイトテーブルが

id/sitename

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

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

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

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

2004/09/19 19:23:22
id:kishiro No.3

kishiro回答回数161ベストアンサー獲得回数42004/09/19 19:16:22

ポイント17pt

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

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

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

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

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

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

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

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

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

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

とか参考になりますよ。

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

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

id:wintarsnow

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

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

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

2004/09/19 19:34:50
id:esseesse No.4

esseesse回答回数192ベストアンサー獲得回数02004/09/19 19:27:43

ポイント17pt

テーブル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できない

id:wintarsnow

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

なるほど!

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

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

2004/09/19 19:49:37
id:upride No.5

upride回答回数220ベストアンサー獲得回数12004/09/19 19:37:27

ポイント16pt

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を割り付けるかどうかですが・・

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

id:wintarsnow

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

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

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

2004/09/19 20:01:33
id:upride No.6

upride回答回数220ベストアンサー獲得回数12004/09/19 19:40:30

ポイント16pt

書き忘れました

カテゴリID と URLやサイト名 (もしくはサイトID)

の2つでユニークです

id:wintarsnow

了解です。

--

皆様ありがとうございました!

2004/09/20 13:09:07

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません