0

我要将用户存储Likes到数据库中。但我不确定这两种方法中哪一种更好:

在我的情况下,用户可以喜欢Posts,CommentsGroups. 像脸书这样的东西。

假设 : 有 1000 万个赞PostsComments并且Groups

方法一:

创建一个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:

为帖子、评论和组中的每一个创建三个单独的表格。


在方法 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

我不喜欢你的任何一种方法。我会更规范化。我会有一个项目类型的表,例如评论、组、帖子等。然后我会有一个项目表。它将有一个 ItemId 作为 PK 和一个对项目类型的 FK 引用。还有一个用户表。最后,likes 表将是项目和用户之间的多对多关系。

于 2013-11-02T20:01:55.410 回答
1

正如 Jan Doggen 所说,您对信息的处理方式是一个重要的考虑因素。特别是,如果您希望能够提出“给定用户喜欢什么东西”的问题,那么您将受益于将所有数据放在一个表中 - 否则,您必须有三个单独的查询才能回答那个问题。

对于“哪些人喜欢给定的东西”这个问题,如果你的表被正确索引(在 likeID/likeType 上有索引,在这个案例)。多表模型将使您的应用程序逻辑更加复杂,并且将来当您想要添加用户可能喜欢的其他内容时将更难扩展。

于 2013-11-02T20:04:58.053 回答