2016-05-20 6 views
2

これは悪い習慣であるかどうか不思議です。私のユーザオブジェクトでは、プロファイル属性の下で私はユーザの好きなものを保存する予定です。たとえば、オブジェクトは次のようになります:他のユーザーデータをユーザーのデータに保存する

この方法は、関連するユーザーが自分のアバターを変更した場合、それは、このユーザーに関連付けられているアバターと同じではないだろうということですそれは何をやってについて私に関する
user = { 
    ... 
    profile: { 
    likes: [ 
     { 
     user: { 
      _id: USER_ID, 
      avatar: USER_AVATAR, 
      username: USER_USERNAME 
     } 
     otherData: true 
     }, 
     ... 
    ] 
    } 
} 

。また、好きなものは無限の量になる可能性があるので、配列が大きくなるにつれてパフォーマンスが低下する恐れがあります。

これにアプローチするより良い方法はありますか?私は伝統的なデータベースで知っている、私はこれのための別のテーブルを持っているだろうし、ユーザーが好きなプルするために結合を使用します。

乾杯!

+0

'profile'の前に' idUser、avatar、username'を追加してみませんか?それから、 'likes'を前の' idUser'にリンクしてください。 –

+0

あなた自身であなたの質問に答えたと思います。静的なオブジェクトとパフォーマンスの問題があるか、そうでない場合は結合クエリを作成する必要があります。 –

+0

@FaysalAhmedは私のアプローチよりパフォーマンスが悪いNOSQLのジョインではありませんか? – Luca

答えて

0

あなたの懸念事項は有効です。 NOSQLデータベースは、データが正しく正規化されず、複数の場所に格納されるため、データの一貫性の問題が発生する可能性があります。

あなたが好きな配列にだけのユーザーIDを格納し、アプリケーション・レベルを行うことによって、これらのデータの一貫性の問題を回避することができますが、プロファイルに参加する参加し、次のようなユーザデータに好き:

likes: [ 
{_id: USER_ID1}, 
{_id: USER_ID2} 
] 

をしかし、これを行うと、基本的にはリレーショナル・モデルに戻ります(ただし、SQLのメリットはありません)。

「正しい」ソリューションは、アプリケーションと、結合を実行したときに発生するパフォーマンスヒットを気にするかどうか、または古いデータを取得する可能性を気にするかどうかによって異なります。

+0

アプリケーションレベルの結合は実際にパフォーマンスに悪影響を及ぼしますか?これはすべてとても汚いと感じます。私は人々が何らかのタイプの関係データなしで複雑なアプリケーションを構築するのを知らない。彼らはデータの不一致を気にしませんか? – Luca

+0

NOSQLデータベースを使用している場合は、パフォーマンス上の理由からおそらく実行しています。 IE)あなたのデータは膨大であり、1つのリレーショナルデータベースボックスがそれをカットすることはありません。その場合は、アプリケーションレベルの結合をしないでデータを複製することをお勧めします。バックグラウンドでは、データを最終的に一貫性のあるものにするプロセスを実行する必要があります*。繰り返しますが、単純なリレーショナルデータベースを使用するよりもはるかに複雑です。データが小さければ、NOSQLデータベースには届かないことをお勧めします。 – gnicholas

+0

NOSQLを使用している理由は、Meteorのデフォルトによるものです。私はリレーショナルデータベースを使いたいと思っています。私はリレーショナルデータベース(MYSQL/POSTGRESを使って何年も)から考えています。私はMeteorのapolloを待つことができないので、やっとSQLを使うことができます。データを一貫性を持たせるために使用できる流星スケジューラーについて知っていますか? – Luca

0

しないでください。好きなものをユーザーコレクションに保存すると、ユーザーのドキュメントが増え続けます。

likesなどの名前の新しいコレクションを作成できます。次に、新しく作成したコレクションのような単一のドキュメントを保存します。

関連する問題