2009-05-30 3 views
0

私のサイトにメディアをアップロードするとどうなりますか?誰もが通知を受けるでしょう。それぞれの人は、削除するためにボックスをクリックすることができ、それは彼らのmsgキューから永遠に消えてしまいます。SQLデータベースに10,000個の挿入を行う最も良い方法は?

私のサイトに1万人の人がいたら、それをどの人のメッセージキューに追加するのですか?私はファイルシステムのジャーナルのようなものを選ぶのに時間がかかりそうだと思いますか?私は人、そのデータ、私の現在の位置に通知する必要があることをマーク。その後、100枚ごとに自分の位置を更新しますか?私はウォッチャーのリストにPKが必要なので、誰かが真ん中に登録すれば私の注文はPKでソートされるので壊れないだろうか?

これは大量の通知システムに最適なソリューションですか?

-edit-

このサイトでは、ユーザーが作成したコンテンツサイトです。管理者はグローバルメッセージを送信でき、一般の人々は何千人もの加入者を持つことができます。

+0

どのデータベースソフトウェアを使用していますか?それは単一のサーバで実行されているのか、マスタ/スレーブの設定で実行されているのか、クラスタとして動作していますか、または...詳細をご記入ください。 –

+0

ウィム:私は実際には詳細を持っていません。現在、私はDBとしてC#とsqliteを使ったプロトタイプを持っています。 –

答えて

3

受信者がメッセージ(recipientid, messageid, status)にリンクしている多対多のテーブルに10000を挿入すると、デザインに大きな問題が発生することが予想されます。

BEGIN TRANSACTION 

INSERT INTO msgs (publisherid, msg) 
VALUES(@publisherid, @msg) 
SET @messageid = SCOPE_IDENTITY() 

INSERT INTO msqqueue (recipientid, messageid, status) 
SELECT subscriberid, @messageid, 0 -- unread 
FROM subscribers 
WHERE subscribers.publisherid = @publisherid 

COMMIT TRANSACTION 
:SQL Server上で知ら

@publisheridが知られていると仮定すると、@msg:基本的には -

この

は、操作の種類は、私は一般的にも、バッチ処理やポスト操作の途中で加入する人々の心配はないです
1

ユーザーに通知する通知を各ユーザーごとに記録するだけです。つまり、ユーザーに表示される通知のセットは、「最も古い通知」の水平線(登録時、または1週間前)より前に作成された通知です。彼らが認めているもの。こうすることで、一度に1人のユーザーになるまで何かを挿入するのを遅らせることができます。また、1週間未満のユーザーメッセージしか表示しない場合は、1週間以上経過した読んだ通知フラグを消去できます。

(私の昔の仕事で私のDBAからパフォーマンス比較を最適化ヒント:「ビジネスプロセスは、最初にそれらを見て、変更する最も簡単なものです」)レコードを挿入

+0

それは構造体をコピーするために何かのように聞こえます(変更時には、すぐにではありません)。しかし、この場合、これは悪くないでしょうか? 10,000人が*私が更新したかどうかを私にポーリングし続けますか? –

+0

メッセージが作成されたときに通知テーブルに挿入しても、どのようにユーザーに通知するのか、それをポーリングする必要がありますか? はい、各ユーザーは「メッセージから選択...メッセージの作成場所:水平線と存在しません(message_readから1を選択します。ここでmessage_read.user =:userとmessage_read.message_id = message.message_id) 。メッセージ(作成された)とmessage_read(user_id、message_id)のインデックスは、それを単純なクエリにする必要があります。 – araqnid

+0

私はユーザのメッセージキューを選択し、それ以外は選択しません。私は私のポストが悪いと思う、私はメディアをアップロードできる唯一の人ではない。そのyoutubeのようなユーザーのコンテンツサイト。グローバルメディアとグローバルなメッセージを投稿できる管理者は数十人いるだろう。それはあなたのmsgセンターの代わりにポーリングするいくつかの場所です。私は、作成者がそれをトリガーするときに挿入を行う予定でした(アップロードはmsg /メディアを送ります)。 –

0

私見では、この問題の最も効率的な解決策ではないかもしれません。ユーザーが通知を削除したかどうか、またはCookieをクリアしてもこれを追跡する必要があるかどうかを保存するために、クライアント側のCookieを使用できますか?新しい動画をアップロードすると、アプリは新しい動画IDとCookieを比較し、Cookieに保存されているものに基づいて通知を表示するか非表示にするかを決定できます。これにより、大量のデータベース挿入を省くことができ、クライアント上で最も重い作業を行うことができます。

+0

私はサーバー上でそれを追跡しなければならないでしょうが、今は10000の代わりに私をポーリングする必要があるので、これはちょうど移動する挿入をisntしますか? –

+0

私は何かが見つからない限り、ページをロードして通知を閉じたことを示すレコードが存在するかどうかを確認するために、いずれの場合も選択を行う必要があります。 – James

0

あなたはPostgresのを使用している場合は、それらすべての最速の方法ですCOPYコマンドを使用することができます:tabfileエントリのたくさんのタブ区切りのファイルである

COPY tablename (col1, col2, col3) FROM '/path/to/tabfile'; 

を。 UNIQUE制約がいくつか存在し、ファイルに重複がある場合、これは失敗します。

1

私は、データベースがうまく機能していることを気にしていると言います。データの挿入と管理試してみてはいけません。コードで実行してください。データを一度に挿入するSQLを記述してください。 10000行は、すべての実際のデータベースの邪魔になります。

関連する問題