私はソフトウェア開発者です。私はコードを愛して、私は現在、私のように、ユーザがエンティティをマークするために許可されるには、ウェブサイト作成しています...データベースを嫌い言っています(FBでのように)、タグ、それをしてコメントを。
この機能を処理するためのデータベーステーブルの設計に行き詰まっています。1つのタイプ(写真など)に対してのみこれを実行できる場合、解決策は簡単です。しかし、私はこれを5つの異なるものに対して有効にする必要があります(現時点では、サービス全体が成長するにつれて、この数が増える可能性があることも想定しています)。
ここで似たような質問をいくつか見つけましたが、どれも満足のいく答えはありません。そのため、もう一度この質問をします。
質問は適切、方法、である効率的かつ弾力それが異なるため、コメント保存することができるように、データベースを設計テーブルを、好き異なるため、テーブルやタグ彼らのために。回答としてのいくつかのデザインパターンが最良です;)
詳細な説明:私はテーブル User
一部のユーザーデータ、および3つの以上とテーブルを:Photo
で撮影、Articles
との記事、Places
と場所。ログインしたユーザーが次のことをできるようにしたい:
これら3つのテーブルのいずれかにコメントする
それらのいずれかを好きとしてマーク
それらのいずれかにいくつかのタグを付けます
また、すべての要素のいいねの数と、特定のタグが使用された回数をカウントしたいと思います。
1 回目のアプローチ:
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 番目のアプローチ:
私は、テーブルが作成されます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
)テーブル内 - count()を選択します。
私の問題の説明が今より完全であることを望みます。