DB設計(MySQL)についての質問です。

現在、小規模(少なくとも当初は)な検索エンジンを作成予定なのですが、テーブル、カラム構成について、次の点で悩んでいます。
(テーブル構成はコメントを参照してください。)

 1) cacheテーブルの「***_on」はurlテーブルに持たせるべきか?
    (「***_interval」と「***_on」を元にクロール等するか決めるため)
 2) cacheテーブルの「status」はurlテーブルに持たせるべきか?
 3) urlテーブルの「***_interval」やcacheテーブルの「***_on」を別テーブルに分けるべきか?
 4) もっと良い構成があれば教えてください。

(1)~(3)、あるいは(4)について、回答、アドバイスをいただければと思います。よろしくお願いします。

(初回のクロール等の後、「***_on」が「***_interval」を超えた場合に再クロール等を行う構成です。)


※ポイント配分にもよりますが、ベストアンサーがあれば最大200ptを送らせていただきます。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/06/01 14:31:47
  • 終了:2010/06/02 12:59:16

回答(2件)

id:Bombastus No.1

ホーエンハイム回答回数409ベストアンサー獲得回数522010/06/01 15:23:21

ポイント100pt

cacheテーブルの方がurlテーブルより頻繁に更新されるという推測のもとに回答します。

1) cacheテーブルの「***_on」はurlテーブルに持たせるべきか?

cacheテーブルに持たせた方が良いと思います。

urlテーブルに持たせると、urlテーブルが頻繁に更新されることとなり、DBコストが高く付くからです


2) cacheテーブルの「status」はurlテーブルに持たせるべきか?

1)と同じ理由で、cacheテーブルに持たせた方が良いと思います。


3) urlテーブルの「***_interval」やcacheテーブルの「***_on」を別テーブルに分けるべきか?

別テーブルに分かる必要はないと思います。

別テーブルに分けると id で張るリンクが増えますので、DBコストが高く付くからです


4) もっと良い構成があれば教えてください。

urlテーブルのurlフィールドがvarchar(255)で足りるのでしょうか。

もし足りるのであれば、ISAMテーブルにするより、固定長テキストデータにした方がアクセス速度が速くなると思います。

id:zaxaxaz

ありがとうございます。

そうですね。ページの鮮度を保ちたいので、どちらかと言えばcacheテーブルのほうが頻繁に更新することになるかと思います。

urlフィールドは悩みどころなので長くするか、固定長テキストも検討したいと思います。

DBコスト面からのアドバイス、大変参考になりました。

2010/06/02 11:47:12
id:ko8820 No.2

ko8820回答回数1221ベストアンサー獲得回数692010/06/01 21:48:20

ポイント100pt

正規化までできてるので、あとは運用と性能を考えて

非正規化するのが一般的な手法です。

1)正規化に反しますが、両方に持たせるべき

  性能を考えて、cacheにも持たせる必要はあると思う。

2)これは、cacheテーブルだけでよい

3) おそらく、この2テーブル構成でなくてもう1,2テーブルを持つべき

urlはマスターテーブルとして設計

  cacheはトランザクションテーブルとして設計

 

マスターテーブルは、電話帳みたいな役割で一回作成したら変更はほとんどしないほうが望ましい

  cacheは、マスターテーブルの電話帳から電話をかけた結果の作業ファイルとして使用

  これ以外に、トランザクションとして管理テーブルを2つほど作成すべきだと思う。

  ・ジョブ管理をするためのトランザクションテーブル(このあたりで、いつクロールさせるかとか登録する)

  ・404が発生した場合に、それを記憶するトランザクションテーブル

はじめての設計をやり抜くための本 概念モデリングからアプリケーション、データベース、アーキテクチャの設計まで (エンジニア道場)
4798117064

id:zaxaxaz

ありがとうございます。

テーブルを増やすことで、柔軟にスケーリングもできそうですね。

マスターテーブル、トランザクションテーブルという視点からのアドバイス、大変参考になりました。

紹介していただいた本も目を通してみたいと思います。

2010/06/02 11:55:50
  • id:zaxaxaz
    質問のテーブル構成になります。

    CREATE TABLE `url` (
     `id` int(10) unsigned NOT NULL auto_increment,
     `uri` varchar(255) NOT NULL,                   /* URL */
     `status` enum('active','deactived') NOT NULL default 'active', /* ステータス(404が続く場合等に対象からはずすため) */
     `extract_interval` int(10) unsigned,               /* URLの再抽出をする間隔 (604800 = 1週間など) */
     `crawl_interval` int(10) unsigned,                /* 再クロールする間隔 */
     `index_interval` int(10) unsigned                /* 再インデックスする間隔 */
     PRIMARY KEY (`id`)
    } ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

    CREATE TABLE `cache` (
     `id` int(10) unsigned NOT NULL auto_increment,
     `url_id` int(10) unsigned NOT NULL,  /* 外部キー */
     `content_type` varchar(255) NOT NULL, /* コンテントタイプ(text/html等) */
     `status` int(3) unsigned NOT NULL,  /* HTTPレスポンスコード(200等) */
     `content` text NOT NULL,        /* クロールしたコンテンツ */
     `created_on` datetime NOT NULL,    /* キャッシュの作成日時 */
     `extracted_on` datetime NOT NULL,   /* キャッシュからURLを抽出した日時 */
     `crawled_on` datetime NOT NULL,     /* URLをクロールした日時 */
     `indexed_on` datetime NOT NULL,    /* キャッシュからデータを抽出した日時 */
     PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

    (インデックス等は省略してます。)
  • id:zaxaxaz
    システム構成を書き忘れました。以下の3つのシステムが基本になります。

     1) クローラー (URLテーブルを元にクロールし、ページをキャッシュデータベースに保存)
     2) スパイダー (キャッシュからURLを抽出して、URLテーブルに保存)
     3) インデクサー (キャッシュからデータを分析・抽出等して、インデックス用のテーブルに保存)

    テーブル構成については、インデックス用のテーブルは除外していますので、その部分は無視していただいてかまいません。

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

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

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

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