[解決済み] データベースへの「コメント」「いいね!」の実装
質問
私はソフトウェア開発者です。コーディングは好きですが、データベースは苦手です...。現在、あるウェブサイトを作成しているのですが、そのウェブサイトでは、ユーザーがあるエンティティを 好き (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つの方法しか思いつきません。
-
要素内(
Photo/Article/Place
) テーブル - select count()で。
これで、私の問題の説明がより丁寧になったかと思います。
解決方法は?
最も拡張性の高い解決策は、(「いいね!」、タグ、およびコメントに関連する)1つのベーステーブルを持ち、他のすべてのテーブルをそこから継承することです。新しい種類のエンティティを追加するには、新しい "inherited" テーブルを追加するだけで、自動的に「いいね!」、タグ、コメントの仕組み全体にプラグインされます。
これを表すエンティティ関係用語は "category"です( ERwinメソッドガイド セクション: "Subtype Relationships"). カテゴリ記号は
ユーザーが複数のエンティティに「いいね!」を押すことができ、同じタグを複数のエンティティに使用できるが、コメントはエンティティに固有であると仮定すると、モデルは次のようになります。
ところで、"ER category"を実装する方法は、おおよそ3通りあるようです。
- 全種類を1つの表にまとめています。
- すべての具体的なタイプは別々のテーブルに。
- すべての具象型と抽象型を別々のテーブルで表示。
よほど厳しいパフォーマンス要件がない限り、3番目のアプローチが最適でしょう(物理テーブルが上の図のエンティティと1対1で一致するという意味です)。
関連
-
MySQLインストールチュートリアル(Linux版
-
[解決済み] 親の行を削除または更新できない:外部キー制約が失敗する
-
[解決済み】MySQLで「すべての派生テーブルは独自のエイリアスを持つ必要があります」というエラーは何ですか?
-
[解決済み】ValueError: 値の長さがインデックスの長さと一致しない|Pandas DataFrame.unique()
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLデータベースの名前を素早く変更する(スキーマ名を変更する)方法は?
-
[解決済み] MySQLデータベースのテーブルのサイズを取得する方法は?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mysqlでインデックスに障害が発生する原因は何ですか?
-
MySQLデータ型の詳細
-
MySQL サービスとデータベース管理
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
[解決済み】文字列からuniqueidentifierに変換する際に変換に失敗する - 2つのGUIDの場合
-
MySQLの一般的な分割ライブラリおよび分割テーブルスキームの概要
-
Mysqlデータベースへのリンク時にpymysqlがConnection refusedエラーを報告する
-
[解決済み] mysqladminのフラッシュホストでブロックを解除する方法
-
[解決済み] INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いは何ですか?[重複しています]。
-
[解決済み] MySQLデータベースのテーブルのサイズを取得する方法は?