Facebookがあなたが「好き」にできるすべての異なるもののデータベース設計をどのように管理するのか疑問に思っていました。好きなものが1つしかない場合、これは単純です。好きなものへの外部キーと、自分が誰であるかへの外部キーだけです。
しかし、Facebookで「いいね」できるテーブルは何百もあるはずです。彼らはどのようにいいねを保存しますか?
この種の構造をリレーショナルデータベースで表現する場合は、通常、テーブル継承と呼ばれる階層を使用する必要があります。テーブル継承では、親タイプを定義する単一のテーブルがあり、次に子テーブルであり、その主キーは親への外部キーでもあります。
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つの方法です。
Facebookには、ほとんどのデータストレージにリレーショナルデータベースを使用していないため、従来の外部キーなどはありません。単純に、彼らはそのためにそれをカットしません。
ただし、いくつかのNoSQLタイプのデータストアを使用します。 「いいね」は、サービスに基づいている可能性が高く、インフラストラクチャ全体でSOAスタイルの方法でセットアップされている可能性があります。このように、「いいね」は基本的に、関連付けたいものすべてに起因する可能性があります。これらすべてが、拡張性が高く、緊密に結合された関係の問題に対処する必要がありません。 Facebookが運営している量では、実際に対処する余裕がない何か。
また、AOP(アスペクト指向プログラミング)スタイルの処理メカニズムを使用して、ページのレンダリング時に必要になる可能性のあるものに「いいね」を「添付」することもできますが、JavaScriptを介したSOAスタイルのWebサービスまたはその他の配信メカニズム。
いずれにせよ、私自身、アーキテクチャの観点から、彼らがこの設定をどのように行っているかを聞きたいと思います。それらのボリュームを考慮すると、単純な「いいね」ボタンでさえ、テクノロジーの重要な実装になります。
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を使用しています。