2010-12-03 12 views
-1

私は自分のWebサイト用のスレッド型メッセージングシステムを構築しようとしています。基本的に、システムは、次の機能を提供しnoSQL実装:スレッド型メッセージングシステム

  • は、ユーザーが応答の
  • 任意レベル(スレッド)

互いの間でメッセージを送信できるように私はすでにのMySQL + PHPを使用しようとした骨格を構築しました。しかし、スレッド取得部分全体では、ある程度再帰的ですが、これはリレーショナルスキーマができる最良のものではないと私は信じています。だから今私は非SQLの実装を研究しています。うまくいけば、このような問題を回避して、データ検索をより自然にすることができます。

誰でも私にヒントを与えてください。

更新:私のクライアントアプリケーションはPHPで書かれているので、おそらくそうです。

+1

-1あなたの質問には答えられません。私はここにnoSQLのソリューションを期待していて、見つけられませんでした。この質問は、SOやコミュニティに役立つものではありません。 –

答えて

1

文書データベースまたはオブジェクトデータベースは、探しているものを非常にうまく処理します。同様に機能するRDBMSでこれを行うこともできます。例えば、スキーマは次のとおりです。あなたは、おそらくあなたの問題を解決するだろう

SELECT * 
FROM messages 
WHERE message_id = ? OR original_message_id = ? 
ORDER BY parent_message_id; 

このように、この表から選択を行うことができます

CREATE TABLE messages (
    message_id INT, 
    original_message_id INT, 
    parent_message_id INT, 
    message VARCHAR(4000) 
); 

。 OODBや文書データベースでこれを行う利点は、すべてが一緒に保存されるため、1つのクエリだけを使用して「会話」のすべてのデータを取り戻すことができることです。欠点としては、すべてのデータを一度に読むことができるように、柔軟なクエリの柔軟性を犠牲にすることです。

0

コメントの代わりにスレッドをメインエンティティとして使用するのはどうですか?最初にSQLと2つのスレッドを試してみましょう。最初のユーザーが最初のメッセージを2番目のユーザーに送信するときは、新しいスレッドを作成し、このスレッドを2人のユーザーとリンクします(ユーザーにはスレッドが多数あります)。メッセージそのものをJSONとして保存することができます。次に、各応答は同じJSON(同じvarcharまたは同様のフィールド)になります。このソリューションは、個々のメッセージを検索(または一覧表示)する必要がない場合に適しています。

例:次に

Users: 
Id-Name 
1-User1 
2-User2 

UsersByThread: 
UId-TId 
1-1 
2-1 

Threads 
Id-JSON 
1-'{"messages":[{"user":"User1","text":"blablabla"}]}' 

、第2のユーザ応答は、簡単なJSONを取り、新しいメッセージを追加:第三者がスレッドに参加する場合は

Threads 
Id-JSON 
1-'{"messages":[{"user":"User1","text":"blablabla"},{"user":"User2","text":"blablabla"}]}' 

を、単にあなたUsersByThreadにリレーションシップを追加し、JSONにメッセージを追加します。

ところで、同じアイデアをソファのようなnosqlストアや、redisのようなキー値ストアで使用することもできます。また、より自然なシステムをneo4jで作成することもできますが、これは通常のSQLデータベースでうまくいくと思います。

関連する問題