2016-08-15 4 views
1

私は現在、データモデリングに苦労しています。いくつかのテーブルには100万を超えるレコードがあり、GROUP BYCOUNTで出力を照会するのにかなりの時間がかかります。だから、私はCouchbaseに移行しました。ビューとインデックスをサポートしています。リレーショナルデータモデリングとドキュメントデータモデリングの間の悩み

私は非常に便利であることがMySQLに大きな利点があります。私はこのようなユーザーに関連するユーザーのテーブルといくつかの記事でユーザーを持っているなど、他の多くのユーザーからこの記事に関連したいくつかの好きな点やコメントもあります。私は通常、JOINを実行するので、ユーザーの名前とプロフィールの画像が出力されます。アウトプットには、他のユーザーの詳細を好きやコメントとともに添付しました。したがって、ユーザーが新しいプロフィール画像をアップロードしたり自分のメールアドレスを変更した場合は、ユーザーテーブルの列を更新するだけで済みます。

はCouchbaseので、私はMySQLのような物品文書にデータを格納user_idとコメント文書などの著者を持ってcommenter_idarticle_idを持っているように文書を作成しようとしました。今では、制限や並べ替えを有効にしてビューやインデックスに参加させることが非常に難しいことが分かりました。そこで、ユーザーのprofile_imgfirst_namelast_nameをすべての関連文書にコピーしました。私は記事のドキュメントを読み込むときだから、構造の下にあります

{ "article_id": 1234, "text": "A good article", "author_id": 1, "first_name": "John", "last_name": "Smith", "profile_img": "0bf34ee0a.jpg", "likes": [ { "user_id": 1, "first_name": "John", "last_name": "Smith", "profile_img": "0bf34ee0a.jpg" }, { "user_id": 2, "first_name": "Paul", "last_name": "Einstein", "profile_img": "1789ab00ef.jpg" } ] "comments": [ { "user_id": 1, "first_name": "John", "last_name": "Smith", "text": "This is my article", "profile_img": "0bf34ee0a.jpg" }, { "user_id": 2, "first_name": "Paul", "last_name": "Einstein", "text": "i like it", "profile_img": "1789ab00ef.jpg" } ] }

これは確かに私のクエリ時間を救いました。 (そうでなければ、記事を最初に照会し、記事と好き嫌いとからユーザーIDを抽出し、ユーザーIDを記事に添付し、ユーザーのIDに応じてコメントとコメントをユーザーに照会する必要があります)。しかし、これは別の問題を引き起こしました。ユーザーがプロフィール画像を更新した場合、すべての記事をクロールしてuser_idを見つけ、profile_imgフィールドを更新する必要があります。

誰にでも私にはどのような手がかりがありますか?

+0

私は、ユーザーID、キーワード、全文検索や 'solr'統合を格納するため、ここでの複雑さを理解していません。私は、インデックスでうまく調整された何百万行ものmysqlソリューションが、驚くほど高速なソリューションではないことが分かりません。特にブロブを避ける場合 – Drew

+1

SQLモデリングを行い、NoSQL/Document Databaseソリューションに変換することはできません。 深刻な解決策には、データを再検討する必要があります。 これは主に、これらのプラットフォームがさまざまな問題を解決する傾向があるためです。 –

答えて

1

this blog postを読んで、これがあなたの質問のいくつかに答えているかどうかを確認してください。

上記のオブジェクトモデルの場合、LikesとCommentsをユーザー文書に埋め込むことは、長期的にはおそらく悪い考えです。はい、サブドックAPIを使用して、JSONの一部を読み書きすることができます。また、バックエンドのレプリケーションなどで支払いを行うだけでなく、時間が経つにつれて文書サイズになる場合もあります。あなたの好みやコメントを自分の文書に入れたほうがよいでしょう。それでも、アクティブなユーザーのためにそのドキュメントがどのように成長したかに満足する必要があります。

他にもう1つ。コメントや好きなものは、コメントしているものやコメントや好きなものに関連していなければなりませんか?それを識別するための標準化されたキーパターンでそれぞれのコメントを独自のオブジェクトに持たせ、そのオリジナルのコメントにコメントしたすべてのオブジェクトIDの配列である別のオブジェクトを持つことは価値があります。同じように同じ。あなたが行うことは、データへのアクセス方法、具体的には、アプリケーションに必要なパフォーマンスとスケーリングのニーズによって異なります。私が言いたいのは、1秒間に500回の操作しか得られないシステムに対して、2回目は200,000秒を行うシステムとはかなり異なるスキーマ設計の決定であるということです。 NoSQLデータベースとNoSQLデータベースとの主な違いは、NoSQLの場合、アプリケーションとユーザーがデータをどのように使用するかを正確にモデル化することがはるかに簡単ですが、RDBMSでは、 DBエンジンとそのデータの保存方法と使用方法に最適です。

また、this postthis oneをお読みください。後者の書き込み速度が高いのはCouchbaseでN1QLの前に書かれていましたが、それに関係なく考えることができるでしょう。

関連する問題