3

Heroku を介して Postgres で Rails アプリを実行しています。

ユーザーのコメントなど、さまざまな項目について、自分のサイトに Facebook の「いいね」のようなものを実装したいと考えています。これらを効率的かつ高速にデータベースに格納する最もスマートな方法は何ですか?

明らかな 1 つは、次のように、ユーザーとアイテムの間に類似の結合テーブルを用意することです。

user_id int
item_id int
item_type string
created_at datettime

ただし、表示されると、アイテムをプルするたびに、like テーブル全体で結合をプルする必要があり、非常に大きくなる可能性があります。

これに対する明白な対応は、進行中のいいねカウントのために、アイテムにカウンターを格納することです。ただし、アイテムの横に表示することと、ユーザーが既に気に入っているもののいいねボタンを非表示にすることの両方で、誰がアイテムを気に入ったかが重要であるため、これは機能しません。

私の計画は、すべての好感の持てるアイテムに、シリアル化された配列を格納するテキスト フィールドを追加することです。そうすれば、アイテムをプルするたびに、誰がそれを気に入ったかの完全なリストが表示されます。これを行うためのより良い方法はありますか、またはこれが推奨されるアプローチですか?

4

1 に答える 1

8

データセットが大きくなりすぎて、結合にコストがかかりすぎると考える理由はありますか? Postgres は、最速の RDBMS ほど高速ではありませんが、最近ではかなり高速です。以前は、1 日に何百万ものページビューを取得する Web サイトを運営していましたが、各ページを生成するにはかなり複雑なクエリが必要でした。少し単純なキャッシングを行うことで、非常に控えめなハードウェアで実行することができました。

非正規化すると、RDBMS を使用する利点の多くが失われます。しなければならないことがわかっている場合にのみ、そうします。その場合は、単純なキー/値データベースなど、そのデータに別のものを使用することを検討します。しかし、非常に多くのデータがある場合にのみ、それが当てはまる可能性が高いと思います。

于 2010-07-24T20:11:02.680 に答える