1. ホーム
  2. mysql

[解決済み] データベースへの「コメント」「いいね!」の実装

2022-04-22 23:21:06

質問

私はソフトウェア開発者です。コーディングは好きですが、データベースは苦手です...。現在、あるウェブサイトを作成しているのですが、そのウェブサイトでは、ユーザーがあるエンティティを 好き (FBでいうところのLike)です。 タグ コメント .

この機能を処理するためのデータベーステーブルの設計に行き詰っています。1つのタイプのもの(例えば写真)に対してのみこれを行うことができれば、解決は些細なことです。しかし、私は5つの異なるものに対してこれを有効にする必要があります(今のところ、私はこの数がサービス全体の成長とともに増加する可能性があることも想定しています)。

こちらで似たような質問をいくつか見つけたのですが、どれも納得のいく回答ではなかったので、再度質問させていただきました。

問題は、きちんとした方法です。 効率的に エラスティックに データベースを設計し、さまざまな テーブル , 好き 異なる テーブル タグ を使用します。回答として、何らかのデザインパターンがあればベストです ;)

詳細説明 : を持っています。 テーブル User には、いくつかのユーザーデータが含まれ、さらに3つの テーブル : Photo 写真 , Articles 記事 , Places 場所 . ログインしているユーザーなら誰でも使えるようにしたい。

  • これら3つのテーブルのいずれかにコメントする

  • どれかを「いいね!」にする

  • 任意のタグを付ける

  • また、要素ごとの「いいね!」の数と、その特定のタグが使われた回数をカウントしたい。



1 st アプローチ :

a) 対象 タグ を作成します。 テーブル Tag [TagId, tagName, tagCounter] を作成します。 多対多 リレーションシップ テーブル のためのものです。 Photo_has_tags , Place_has_tag , Article_has_tag .

b) コメントも同様にカウントされます。

c)私が作成するのは テーブル LikedPhotos [idUser, idPhoto] , LikedArticles[idUser, idArticle] , LikedPlace [idUser, idPlace] . の数 好き で計算されます。 クエリ (これは、悪いことだと思いますが)。そして...

最後の部分のこのデザインは、私には本当に嫌な臭いがします;)



2 nd アプローチ :

テーブルを作成します ElementType [idType, TypeName == some table name] の名前を管理者(私)が入力します。 テーブル である可能性があります。 好き , コメント または タグ付き . そして、私が作成するのは テーブル :

a) LikedElement [idLike, idUser, idElementType, idLikedElement] で、コメントとタグも同様に、それぞれに適切なカラムを設定します。さて、写真をいいね!にしたいときは、挿入します。

typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)

と場所に対して

typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)

といった具合に...。2番目のアプローチの方が良いと思うのですが、このデザインも何か物足りない気がします...。

最後に、その要素が何回「いいね!」されたかというカウンターをどこに格納するのがベストなのか、ということも考えています。2つの方法しか思いつきません。

  1. 要素内( Photo/Article/Place ) テーブル
  2. select count()で。

これで、私の問題の説明がより丁寧になったかと思います。

解決方法は?

最も拡張性の高い解決策は、(「いいね!」、タグ、およびコメントに関連する)1つのベーステーブルを持ち、他のすべてのテーブルをそこから継承することです。新しい種類のエンティティを追加するには、新しい "inherited" テーブルを追加するだけで、自動的に「いいね!」、タグ、コメントの仕組み全体にプラグインされます。

これを表すエンティティ関係用語は "category"です( ERwinメソッドガイド セクション: "Subtype Relationships"). カテゴリ記号は

ユーザーが複数のエンティティに「いいね!」を押すことができ、同じタグを複数のエンティティに使用できるが、コメントはエンティティに固有であると仮定すると、モデルは次のようになります。


ところで、"ER category"を実装する方法は、おおよそ3通りあるようです。

  • 全種類を1つの表にまとめています。
  • すべての具体的なタイプは別々のテーブルに。
  • すべての具象型と抽象型を別々のテーブルで表示。

よほど厳しいパフォーマンス要件がない限り、3番目のアプローチが最適でしょう(物理テーブルが上の図のエンティティと1対1で一致するという意味です)。