web-dev-qa-db-ja.com

Facebookの「いいね」データ構造

Facebookがあなたが「好き」にできるすべての異なるもののデータベース設計をどのように管理するのか疑問に思っていました。好きなものが1つしかない場合、これは単純です。好きなものへの外部キーと、自分が誰であるかへの外部キーだけです。

しかし、Facebookで「いいね」できるテーブルは何百もあるはずです。彼らはどのようにいいねを保存しますか?

27
Oskar Kjellin

この種の構造をリレーショナルデータベースで表現する場合は、通常、テーブル継承と呼ばれる階層を使用する必要があります。テーブル継承では、タイプを定義する単一のテーブルがあり、次にテーブルであり、その主キーは親への外部キーでもあります。

Facebookの例を使用すると、次のようになります。

User
------------
UserId (PK)

Item
-------------
ItemId (PK)
ItemType (discriminator column)
OwnerId (FK to User)

Status
------------
ItemId (PK, FK to Item)
StatusText 

RelationshipUpdate
------------------
ItemId (PK, FK to Item)
RelationshipStatus
RelationTo (FK to User)

Like
------------
OwnerId (FK to User)
ItemId (FK to Item)
Compound PK of OwnerId, ItemId

完全に言えば、Facebookがこの種のことのためにRDBMSを使用していないことは注目に値します。彼らは、この種のストレージ用のNoSQLソリューションを選択しました。ただし、これは、このような疎結合の情報をRDBMS内に格納する1つの方法です。

25
Adam Robinson

Facebookには、ほとんどのデータストレージにリレーショナルデータベースを使用していないため、従来の外部キーなどはありません。単純に、彼らはそのためにそれをカットしません。

ただし、いくつかのNoSQLタイプのデータストアを使用します。 「いいね」は、サービスに基づいている可能性が高く、インフラストラクチャ全体でSOAスタイルの方法でセットアップされている可能性があります。このように、「いいね」は基本的に、関連付けたいものすべてに起因する可能性があります。これらすべてが、拡張性が高く、緊密に結合された関係の問題に対処する必要がありません。 Facebookが運営している量では、実際に対処する余裕がない何か。

また、AOP(アスペクト指向プログラミング)スタイルの処理メカニズムを使用して、ページのレンダリング時に必要になる可能性のあるものに「いいね」を「添付」することもできますが、JavaScriptを介したSOAスタイルのWebサービスまたはその他の配信メカニズム。

いずれにせよ、私自身、アーキテクチャの観点から、彼らがこの設定をどのように行っているかを聞きたいと思います。それらのボリュームを考慮すると、単純な「いいね」ボタンでさえ、テクノロジーの重要な実装になります。

2
Adron

Id、ForeignId、Typeのテーブルを作成できます。タイプは、写真、ステータス、イベントなどのようになります。ForeignIdは、テーブルTypeのレコードのIDになります。これにより、コメントといいねの両方が可能になります。すべてのいいね、すべてのコメント、および私が説明した1つのテーブルに必要なテーブルは1つだけです。

例:

Items
Id  | Foreign Id  | Type
----+-------------+--------
  1 |         322 | Photo
  4 |         346 | Status

Likes
Id  | User Id     | Item Id
----+-------------+--------
  1 |         111 | 1

ここで、Id 111のユーザーは、Id322の写真を気に入っています。


注:RDBMSを使用していると思いますが、Adronの回答を参照してください。 FacebookはnotほとんどのデータにRDBMSを使用しています。

0
user142019