2009-07-17 20 views
8

チャットルームアプリケーションのメッセージを保存するデータベースを作成しているとします。無制限のチャットルームがあり(実行時にオンデマンドで作成されます)、すべてのメッセージをデータベースに保存する必要があります。データベース設計 - 数十億のレコードが1つのテーブルにありますか?

すべてのチャットルームのメッセージを格納する1つの巨大なテーブルを作成し、最終的にその1つのテーブルに何十億ものレコードが存在する可能性があることを知っているのは間違いでしょうか?

作成された各部屋のテーブルを動的に作成し、その部屋のメッセージをそのテーブルにのみ保存する方が賢明でしょうか?

+1

あなたはあなたのユースケースについて詳しく説明することがあります。高い書き込みですか?どのようなタイプの読み込みですか?他の情報がない場合、1つの表が「最も正しい」ものです。しかし、それが実際の世界でどのように機能するかは全く別の問題です。そして、人々が正確に答えるための情報を与えていない。 –

答えて

8

単一のテーブルを持つことは適切です。アプリケーションの使用量が増えるn個のテーブルがある場合は、データベースそのものをテーブルのテーブルとして使用する方法について説明しています。これは、RDBMSの設計方法とは異なります。現代のデータベースでは、1つのテーブル内の何十億ものレコードが自明です。そのレベルでは、パフォーマンスに関する懸念事項として、良いインデックスと結合の仕方があります。

+2

この回答に加える...また、ある次元に基づいて表を連合させることもできます。機械的に見て、別のテーブルのように見えますが、インデックスを使用してシームレスに結合されています。再度、OPからのより多くの情報が必要です。 –

4

チャットルームごとにテーブルを作成することはできますが、各データベースには作成できるテーブルの数に制限があるため、無制限のチャットルームがある場合、無限のテーブルを作成する必要があります。うまく動作しません。

一方、数十億行のデータを格納することができますが、通常はスペースがあれば問題はありません。適切な時間枠内での情報の取得は慎重な計画です。

メッセージを日付範囲でパーティション化することができます。計画している場合は、LUN移行を使用して古いデータをより低速のストレージに移動することができます。

8

何十億ものレコード?

1分あたり1メッセージで常にアクティブなユーザーが1000人いると仮定すると、1日あたり1.5mioのメッセージ、およそ500mioのメッセージが1年に発生します。

何年か前にチャットメッセージを保存する必要がある場合は、年単位のテーブルにアーカイブすることができます。

ルームベースのテーブルを動的に作成することは間違いありません。

+1

合意。なぜあなたはログにデータベースが必要でしょうか? .txtファイルを使用してチャットをアーカイブするだけです。私はあなたがおそらくデータベースを考えた理由である-legal-理由のログが必要だと仮定しています。読み取り操作を行う必要がない場合は、ファイルシステムの使用率がはるかに高くなります。 – Zack

+3

申し訳ありませんが、文字通りそうは思わないです。これは実際のシナリオではありませんが、前提は同じです。あなたが想像できるシナリオに関係なく、何十億というレコードを仮定します。 – core

2

厳密に言えば、あなたのデザインは正しい、単一のテーブル。エントロピーが低いフィールド(たとえば、「userid」 - IDテーブル(通常のデータベース正規化パターンに従っている))からリンクしたい場合は、範囲ベースのパーティションについて考えるとよいでしょう。たとえば、年プレフィックスを持つテーブルの「コピー」。または単に「現在の」およびアーカイブテーブルでさえも同じです

これらのアプローチのどちらも、クエリのセマンティクスがより複雑であることを意味します(複数の年の検索を行った場合)。

ただし、現在のテーブルはほぼ一定のサイズになり、アーカイブはより簡単です。 - {あなたが2005年のデータをアーカイブするとき、あなただけのテーブル2005_Chatをドロップすることができます}

のブランク

関連する問題