2009-07-05 12 views
33

私は現在データベース駆動型のウェブサイトを設計中です。主な理由は学習目的のためですが、私はうそはありません、含まれている虚栄心の少量です!記事や他の大きなテキストをデータベースに保存する方法

私のデータベース設計は今のところかなり良いと思うが、記事や他の大きなテキストを保存する最良の方法についてはまだ完全にはわかっていない。たいていのDBMSはTEXTデータ型を持っており、膨大な量のテキストを保持することができます。しかし、完全な記事を1つの長い文字列として保存すると不幸な読書が行われるため、書式設定が必要になります。

すべてのHTMLタグまたはBBcodeタグとともに記事のテキストを保存しますか?HTMLまたはXMLドキュメントでページを作成し、このファイルへのパスをDBに保存する方が良いですか?

カスタムタグでアーティクルを簡単にマークアップし、PHPのXMLとXSLT関数を使用してXMLをHTML [実際には他の形式]に変換できるので、記事をXMLドキュメントとして保存するというアイデアはかなり好きです。また、作成者は、改行を作成するタイミングを指定することもできます。このアプローチは、もちろん余分なコーディングを必要とするでしょうが(私は恐れていませんが)、記事を検索可能にする問題があります。

たとえば、MySQLには、テキストフィールドに保持されている文字列内の特定の用語/語句を検索するためのSQL構文があります。別のファイルにテキストを格納する場合、これらの記事を検索可能にするにはどうすればよいですか?

あり、私はこのような簡単な質問にここに書かれている、非常にたくさんあるので、私はそれを打破します:

1:直接データベースにフォーマットされた大量のテキストを格納する「最良の」方法はありますまたは
2:HTML/XML /任意のドキュメントの形式でそのテキストへのパスを保持する方がよいでしょうか。

2の場合、そのテキストを検索可能にするエレガントな方法がありますか?なぜすべて保存しない -

はあなたがすべてを配置してインストールした方法によってはお時間:)

答えて

20

アレックスが提案したように、1つの大きなテキストフィールドにすべてを保存します。検索のために、データベースをハンマーにしないでください。Lucene、またはhtdigを使用して、出力の索引を作成してください。このように検索は非常に高速です。副作用は、検索エンジンをより使いやすくすることです。キーワードフィールドを(バックスラッシュを示唆しているように)取り、meta-keywords属性に貼り付けます。

編集

あなただけの検索が(今までのフォーラムを検索し、それが永遠に取る?)恐ろしく遅くなるんデシベルを持つ、キーワードを検索している場合を除き。インデックスへのデータベースのための方法はありません

select.. where FULLTEXTFIELD like '%cookies%'. 

それは記事を探してイライラさせられると、検索はあなたは、彼らがキーワードフィールドになっていないため、探している結果を返しません! Htdigでは、記事の全文を効率的に検索することができます。あなたの検索は即座に戻ってくるでしょうし、記事のすべての用語は完全に検索可能です。メタタグにキーワードを入力すると、検索結果ページでそのキーワードの検索が高くなります。

もう1つの利点は、ファジーマッチングです。 「アクティブ化」を検索すると、htdiggはアクティブ、アクティブ化、アクティビティなど(設定可能)を持つページと一致します。また、ユーザーが単語のスペルを間違えても、それでも一致します。あなたのユーザーは、迷惑なものではなく、Googleのような経験をしたい。 :)

データベースのすべてのページへのリンクリストを作成するには、スクリプトが必要です。 htdigがこれを自動的にクロールして、再度それについて考える必要はありません。

また、htdigはデータベース以外のページもクロールしますので、サイト全体を同じ単純なインターフェイスで検索することができます。

には、記事のIDとキーワードフィールド(1行あたり1キーワード)のキーワードと呼ばれる別のテーブルが必要です。しかし、簡単にするために、DB内に単一のフィールドを持つことはひどい考えではありません。キーワードをフォームに入れると、キーワードを簡単に更新できます。

すべての手間を払わずにお待ちいただける場合は、 Google custom searchをお試しください。はるかに少ない作業ですが、すべてのページが索引付けされるという保証はありません。

幸運を祈る!

+0

ワウ、ありがとう、バイロン。あなたの編集は大きな助けとなり、ht:// Digは私が思ったようにかなり制限的に見えません。 DBを持つ本当に小さなサイトでは、検索は大したことではありませんが、自分のサイトで自分のプロジェクトが動作すれば他の人にも再利用でき、スケーラビリティがあればいいと思っています。 それは将来のためです、私は実際に物事をコードする必要があります:) – Etzeitet

2

をありがとう、それだけで罰金DBにアクセスできるリモートクライアントから外部ファイルにアクセスすることは難しいことができます代わりに1つのテキストフィールドにXMLの? DBエンジンがその負荷をうまく処理できない場合、後で最適化するためにリファクタリングすることができますが、これが最も簡単な方法です。

9

大量のテキスト(RDBMSに応じて64KBから4GBまで)を格納するために、TEXT、BIGTEXT、LONGTEXTなどのデータ型フィールドが作成されました。彼らはちょうどデータベースのテキストを見つけるためにバイナリポインタを作成し、テーブルに直接格納されていません。 varcharフィールドにパスを保存してドキュメントを検索すると、ほとんど同じ手順になりますが、データベースに格納すると、他の手順で文書を削除する必要がないため、文書が表示されない行が削除されるため、 (あたかもファイルとして保存したかのように)。論理的には、これによりデータベースが大きくなり、時にはバックアップや転送が容易になることはありませんが、ドキュメントを1つずつ移送するのは退屈で遅くなります。

ご覧のとおり、データベースの文書と行の量によって異なります。

検索の手順を迅速にするために、新しい「キーワード」フィールドを作成することをお勧めします。ドキュメントの最初のn文字までも検索し、CHARまたはVARCHARとしてキャストし、特定のフィールドがない場合は、タイトルとサブタイトルをこの量に配置できます。

1

ネイティブxmlデータベースを簡単に見てください。いくつかあり、非常に良いものは無料です。

検索eXist、Document xDB、Oracle Berkeley。

半構造化されたテキストを永続化したり更新したり、構造体に深みがある場合は、ポインタのRDBを使用するか、stuff-it- in-a-blob技術 - これらのアーキテクチャが必要かつ成功を収めることができる多くの外的理由があるが、

デザインにコミットする前にXPathとXQueryを少し読んでください。ここから始めましょう。https://community.emc.com/community/edn/xmltech

関連する問題