13

練習用の小さなフォーラムを作成しています。phpBB のようなフォーラムでは、スレッド テキストが別のテーブルに保存されているようです。

なんで?すべてを同じテーブルに格納してみませんか?

何かのようなもの:thread_id, thread_date, thread_text, thread_author

なぜこのように行われるのですか?どのようにしますか?

4

7 に答える 7

18

このクールなスキーマをオンラインで見つけました。

スキーマ
(出典:円デザイン.com

基本的なフォーラムのデータベース スキーマのかなり良いスターターのようです。

これが古いことは知っていますが、この質問をもう一度見つけようとしている人のために投稿すると思いました。

于 2011-11-18T19:54:39.813 に答える
5

なぜこれが行われるのかは実際にはわかりませんが、想像できる理由の 1 つは、投稿のメタデータ (日付、作成者など) の検索と取得を最適化することです。

Joel によると(そして Joel は常に正しいです! ;-) データベースは、固定長レコードを構成する固定長フィールドにデータを格納するため、ポインターを 1 バイト長だけインクリメントするだけで、ある行から次の行に簡単にジャンプできます。記録。しかし、投稿テキストを格納するために使用される大きなテキスト フィールドは、固定サイズにすることはできません。投稿の長さは広範囲にわたって変化し、すべての投稿を保持するのに十分な大きさの固定長ストレージを作成すると、膨大な量のスペースが浪費されるためです。つまり、投稿テキストを他の情報と同じテーブルに保存すると、誰かがメイン フォーラム ページを表示するたびに行われるように、多数の投稿のメタデータを取得する場合に処理が大幅に遅くなります。

両方の長所を活かす方法は、固定長フィールド (投稿テキスト以外のすべて) を 1 つのテーブルに配置し、可変長フィールド (つまり投稿テキスト) を別のテーブルに配置することです。

于 2009-02-20T21:12:29.327 に答える
3

1 つには、ほとんどのリレーショナル データベースのファイル システム レイアウトは、任意のテキストまたはデータの大きなブロックを格納すると、システムの速度が低下する可能性があるというものです。通常、データは行ごとに格納されるため、データベースは、検索を行うときに、関連のないフィールドを探す場合でも、可変長テキスト フィールドをスキップする必要があります。

第 2 に、すべてを 1 つのテーブルに入れると、後でデータ モデルに追加することが非常に難しくなります。たとえば、各 thread_id にさらにデータが必要な場合です。

データベース スキーマを適切に設計するには、ある程度の教育が必要です。http://en.wikipedia.org/wiki/Database_normalizationから始める必要があります。必ず第 3 正規形を理解してください。

于 2009-02-20T21:11:36.240 に答える