12

Facebook などのソーシャル ネットワークで見られるようなニュース フィードを実装する必要があるとします。現在、画像、コメント、フレンドシップ、グループメンバーシップなど、あらゆる種類のポリモーフィックな関連付けを持つニュース クラスを使用しています。オブジェクトが作成されるたびに、ニュースも作成されます。AR(ActiveRecords) では正常に動作していますが、DM(DataMapper) または Sequel に切り替えると問題が発生します。どちらもポリモーフィック アソシエーションをネイティブにサポートしておらず、その使用を推奨していないためです。

1 つの回避策は、多くの UNION を持つ大きな SQL 句を使用して、ニュースと見なされるすべての異なるテーブルをマージすることです。しかし、これにはいくつかの欠点があり、特にパフォーマンスがひどいものになります。

それで、ニュースにメタデータを追加する可能性があるなど、優れたパフォーマンスと他の欠点なしで、ポリモーフィックな関連付けなしで解決するにはどうすればよいでしょうか?

4

2 に答える 2

22

免責事項: 私は Sequel の主任開発者です。

通常、最善の方法は、データでどのようなことをしたいかによって異なります。これを行う 1 つの方法は、考えられるすべての関係に対して外部キー列を用意することです。

news:
  id
  ... (Other columns)
  image_id
  comment_id
  friendship_id
  group_membership_id

この方法で処理を行う場合と、一般的な外部キーを使用してクラス名を格納する場合とでは、実際にはパフォーマンスの違いはありません。遅延ロードの場合、nil/NULL ではない外部キー フィールドを 1 つ選択し、ロードする適切な関連付けを選択するだけです。テーブルごとのクエリの熱心な読み込みの場合は、すべての関連付けを一度に読み込むだけです。これは、ポリモーフィック アプローチでは不可能な JOIN を使用して積極的に読み込むことができるという点でもより柔軟です。さらに、真の参照整合性の利点も得られます。

1 つの欠点は、将来さらに関連タイプを追加する場合、テーブルに外部キーを追加する必要があることです。

于 2010-06-17T21:55:17.940 に答える
2

以下は、Rails のデータベース レベルでポリモーフィック アソシエーションの参照整合性を維持するための gem です。

https://github.com/mkraft/fides

この投稿の時点で、SQLite3 および Postgresql 用のアダプターがあります。

免責事項:私は宝石を書きました。

于 2013-04-01T12:13:47.323 に答える