php new database




Facebookのようなメッセージのためのデータベースデザイン (7)

"あなたのmysqlテーブルがメッセージシステムのためにどのように見えるべきですか"を意味するなら、メッセージシステムで次のカラムを使用します:

message_id
fromuser
fromview
fromstatus
touser
toview
tostatus
title
text
poston
thread

Message_idは明らかにauto_incrementです。 fromuserとtouserは明らかです。 fromstatusとtostatusはアクティブ、削除、パージ、ドラフトなどです。 Fromviewとtoviewは 'yes'と 'no'に設定されています。 タイトル、テキスト、および 'ポストン'の日付は明白です。 スレッドは、HTMLフォームとメッセージ表示スクリプトに応じて、少し努力するかもしれません。

フォームの場合は、 "to:"フィールドに基づいてforeachループを作成し、各受信者のコピーを保存します。

私はこのメッセージシステムが何百万ものものを保持すると期待していますが、何百万というものはおそらく数年離れているでしょう。 私はそれを小さくてシンプルに保っています。

私は現在、PHP / MySQLで新しいシステムを計画しており、私が保存しようとしているデータの量をデータベースが処理できることを確認したいと考えています。 私の新しいプロジェクトの特徴の1つは、Facebookのような「メッセージ」機能です。 私は、エンドユーザーにとって最高のエクスペリエンスを生み出すことを確実にしたいと思います。 ウェブサイトは結局、数百万のメッセージを集約して1000人のユーザーを処理します。 データベース設計の最適なアプローチは何でしょうか? MySQLは使用する正しいデータベースですか?



あなたはあなたが勉強したいことについてはあまり正確ではありません。 はい。 私はあなたにいくつかのアドバイスをしようとします。

  1. 正規化
  2. インデックス
  3. 高負荷のテーブル用MyISAM
  4. 非正規化(ic!)、あなたは何をやっているのか理解しておくべきです
  5. シャーディング
  6. 柔軟性のための最小限のDB層

シャーディングは、あなたの「広範な」要件には必ずしも必要ではありません...かなりの量のデータを扱いましたが、10億レコードを超える多数のテーブルが存在するまで、パーティション化されたテーブルとシャードの実装について考慮しませんでした。少し遅くなります)。 スマートキーを使用してテーブルを索引付けすることもできます。また、eav型構造を使用してテーブルを狭くし、クエリでのヌルリターンを軽減することも考えられます。

上記は半分眠っている間に書かれているので、誤字を無視する;)


データベースを正しく設計すると、データ量によってlogarithmicallyパフォーマンスが低下します。 言い換えると、クエリを実行する時間はデータ量よりもはるかに遅くなります。

この目標を達成するには、いくつかのことについて訓練を受けなければなりません。

  • データベース設計は健全でなければなりません。 ERモデリングと正規化を理解することは不可欠です。 インデックスやその他の物理的なデータ構造の解剖学を理解することです。
  • 素敵な正規化されたデータベースを作成した後、パフォーマンス上の理由から純粋に非正規化されるべきであるかどうかを検討してください。
  • このプロセス全体を通して、クライアントアプリケーション1がどのような種類のクエリを行うかを覚えておいてください。
    • それに応じてインデックスを設計する - あなたが必要と思っているクエリに特にインデックスを付け、オーバーインデックスしないでください!
    • サロゲートキーとサロゲートキーの使用や、識別できない関係の識別など、設計上の決定が必要なジョインの量に影響する場合があります。
    • クラスタ化された範囲スキャン、 インデックスのみのスキャンなどにデータベース設計をやりなおしてください。
  • clustering 、パーティション化、キー圧縮、マテリアライズド・ビュー(等)などのDBMS固有のメカニズムを使用してください。 DBMSが不可欠であると思われるメカニズムをサポートしていない場合は、DBMSを切り替えるのを恐れないでください! たとえば、 InnoDBテーブルは常にクラスタ化されています 。これはPKで照会するときのメリットですが、二次インデックスが必要な場合は不利になる可能性があります。 クラスタ化されたテーブルとヒープベースのテーブルの両方が必要な場合は、両方をサポートするDBMS(OracleまたはMS SQL Serverなど)を使用してください。 2
  • クライアントアプリケーションを慎重にコーディングします。 宗教的にバインドされたパラメータとクエリのpreparation使用する - SQLの解析とクエリの計画のオーバーヘッドを最小限に抑えるだけでなく、SQLインジェクションにも耐性があります。 ORMとライブラリは、手動で行うことを防ぎますが、 "カバーの下"で何が起こっているのかはまだ分かります。
  • そして最後には、前提に基づいて中継しないでください。 データベースのパフォーマンスは、きめ細かな(そして複雑な)バランスの取れた行為になる可能性があり、特定の決定の影響はすぐには分かりません

これを正しく行うと、「古典的な」DBMSが十分に機能しなくなる前に、実際のFacebookのデータ量に近づく必要があります。 このような状況では、1000人のユーザーと数百万のメッセージは「大規模」とはみなされません。

1 DBMSの観点から見た "クライアント" - これは中間層でもあります。

2 MyISAMもクラスタ化されていませんが、通常の使用から失格になるような重大な制限(トランザクションサポートの不在など)があります。


予算をお持ちの場合は、MySQLで始まり、Zend :: DBのようなシステムを使用するか、より高いレベルのDoctrineを使用してください。

DMBSを簡単に切り替えてから、DBMSを最初から選択することがより重要になります。


私はオブジェクト指向のデータベースとnosqlシステムについて読んでいると思いますが、これは非常に興味深い概念です。Rubyのような有名なフレームワークが積極的に使用していますので、データを心配する必要はありません。私はそれが少し話題だが、それほど複雑ではないデータベースがスケーラブルなシステムへの移行を容易にすることを意味していると私は認識している

ただし、リレーショナルデータベースほど強力なユーザーベースを持たないことで、問題の解決策を見つけるのが難しくなります。また、それに合わせるのにも同じ時間がかかりますが、各段階でデータベース設計を行うビジネスロジックを書くことは驚くべきことですが、後でボトルネックやパフォーマンスの問題に直面するときには、開発の時間が短縮されます。







database-design