'喜欢'系统数据库

时间:2012-05-31 10:42:04

标签: mysql database

我正在开发Web应用程序,我必须在facebook上实现'Likes'系统。应用程序将包含客户可以“喜欢”的几类产品。所以我已经开始创建数据库,但我坚持一个障碍。据我所知,有两种方法可以做到这一点:

首先。创建一个包含“id,user_id,item_category,item_id”字段的数据库表。当用户点击“赞”时,按钮信息将保存在此表中,包含各种类别的产品(item_category)。

二。为某些类别的项创建多个表。例如,“tbl_item_category_1,tbl_item_category_2,tbl_item_category_3”,字段为“user_id,item_id”。

很高兴能够更深入地了解此类数据库结构的最佳实践。哪个更快?更合乎逻辑/更实际?我将只使用几类物品。

3 个答案:

答案 0 :(得分:2)

我会使用与此类似的表结构的第一个版本:

User Table: PK id
id
username

Category Table: PK id
id
categoryname

Like Table: PK both user_id and catgory_id
user_id
category_id

这是一个SQL Fiddle,其中包含表格结构的演示,其中包含两个示例查询,用于按用户分类总分数和按类别分类总数

第二个 - 创建多个表是一个糟糕的主意。如果你有50-100个类别试图查询那些表将是可怕的。这将变得完全无法管理。

如果您有多个表尝试获取总数,那么:

Select count(*)
from category_1
JOIN category_2
    ON userid = userid
join category_3
    ON userid = userid
join .....

使用一张表,毫无疑问。

答案 1 :(得分:1)

第一种方法是正确的方法。永远不要为项目类别制作多个表格,这会使维护代码成为一场噩梦,并使查询变得丑陋。

事实上,一般规则是任何动态的(即它改变)都不应该存储为一组静态对象(例如表格)。如果您认为以后可能会添加新类型的'something',那么您需要一个'某些'类型表。

例如,假设尝试计算用户喜欢的项目数。使用第一种方法,您可以只执行SELECT COUNT(*) FROM likes WHERE user_id = 123,但在第二种方法中,您需要执行JOIN或UNION,这对性能有害,对可维护性不利。

答案 2 :(得分:0)

第一种方法是正确的方法。因为您不知道您将拥有多少类别,并且很难获得数据。