0

Likesユーザーをデータベースに保存します。しかし、これら2つの方法のどちらが優れているかはわかりません。

私の状況では、ユーザーはPostsCommentsおよび を気に入ることができGroupsます。フェイスブックのようなもの。

Posts:に対して1,000 万のいいね! があると仮定しますCommentsGroups

方法 A:

Likeテーブルを作成し、LikeTypeフィールドを追加します。

+--------+----------+--------+
| likeID | LikeType | userID |
+--------+----------+--------+
|   1    |    1     |    1   | // User 1 liked a post
+--------+----------+--------+
|   2    |    2     |    1   | // User 1 liked a comment
+--------+----------+--------+
|   3    |    3     |    1   | // User 1 liked a group

LikeType内容: 1,2,3 1 = 投稿、
2 = コメント、3 = グループ

方法 B:

投稿、コメント、およびグループのそれぞれについて、3 つの個別のテーブルを作成します。


方法Aでは、

いいねが多すぎてWhere status = 1, or 2, or 3、投稿、コメント、またはグループのいいねを取得するために追加の条件 ( ) が必要になるため、どの方法が優れていますか?


更新された投稿:

users
    uid     // PK
---------------------------------------
itemTypes
    typeID          // PK
    typeText        // comments, groups, posts
---------------------------------------

--------------------------------------- +
posts                                   |
        id              // PK           |
        typeID          // 1            |
        ...                             |
--------------------------------------- +
comments                                |
        id              // PK           |
        typeID          // 2            |
        ...                             |
--------------------------------------- + Items
groups                                  |
        id              // PK           |
        typeID          // 3            |
        ...                             |
--------------------------------------- +
photos                                  |
        id              // PK           |
        typeID          // 4            |
        ...                             |
--------------------------------------- +

---------------------------------------
likes
    uid                // FK to user id
    itemid             // FK to posts, groups, photos, comments id
    itemType           // FK to itemsTypes.typeID



// select post #50 likes
SELECT count(*) FROM likes WHERE itemid = 50 and itemType = 1

// select comment #50 of user #2
SELECT * FROM likes WHERE itemid = 50 and uid = 2 and itemType = 2 

これは良いスキーマですか?

4

2 に答える 2

1

私はあなたの方法のどちらも好きではありません。私はもっ​​と正常化します。コメント、グループ、投稿などのアイテム タイプのテーブルを作成します。次に、アイテムのテーブルを作成します。PK として ItemId を持ち、アイテム タイプへの FK 参照を持ちます。users テーブルもあります。最後に、likes テーブルは、アイテムとユーザーの間の多対多の関係になります。

于 2013-11-02T20:01:55.410 に答える
1

Jan Doggen が言ったように、情報を使って何をするかは重要な考慮事項です。特に、「特定のユーザーが好きなものは何か」という質問をしたい場合は、すべてのデータを 1 つのテーブルに格納することでメリットが得られます。それ以外の場合は、答えるために 3 つの個別のクエリが必要になります。その質問。

「どの人が特定のものを好むか」という質問の場合、テーブルが適切にインデックス化されている場合 (likeID/likeType のインデックスを使用)、単一テーブル モデルと複数テーブル モデルのパフォーマンスの違いは比較的小さいはずです。この場合)。複数テーブル モデルでは、アプリケーション ロジックがより複雑になり、将来、ユーザーが気に入る可能性のある他のものを追加したい場合に拡張するのが難しくなります。

于 2013-11-02T20:04:58.053 に答える