数据库实现简单的“喜欢它”功能

时间:2013-02-08 18:01:49

标签: php mysql sql

我想在FB中实现类似“喜欢它”的功能。

我希望用户能够简单地点击他们喜欢的对象下的按钮。只有正面投票。

事情是我想要记住,他们喜欢什么对象,所以我必须将它保存在我的数据库中。让我们说,只有一种类型的对象可以保持简单。

最简单的方法是创建一个表,它将实现多对多关系(用户对象)。

我的问题是:

  1. 在性能方面是否合理?像这样的表会非常大并经常使用。 ;)

  2. 有更好的方法吗?

5 个答案:

答案 0 :(得分:2)

1)是的,确实如此。请记住在两个外键上保留索引(更好的是,将两个键都作为复合主键)

2)不是我所知道的。

答案 1 :(得分:1)

  1. 是的。删除/更新喜欢的内容不会有任何问题。正如Arjun Khosla所说,只是不要忘记添加密钥。
  2. 您的数据库结构可能如下所示

    <强>对象

    ID  name
    1   post
    2   status
    

    <强> like_to_object

    ID  objectID    userID  time
    1   2           3       1231231231
    2   1           5       1231231231
    

答案 2 :(得分:1)

假设该对象是一篇文章并且有一个表格db的文章列表(唯一ID),用户拥有自己的用户列表表格db(唯一ID)。就像WordPress一样,为对象(文章)创建一个新的元表。不仅为此目的,您可以多次使用此表以用于其他目的

    ID             object_id           meta_name            value
(unique ID)  (object/article id)   (meta name value)     (meta value)

将类似数据保存在多个数组数据中,具有唯一的元名称值,例如'user_like'。因此,稍后您只需要调用元表WHERE object_id == article idmeta_name == 'user_like'中的当前数据。

//example saving the data into DB

//get current data
//get a row value from meta table where object_id = article id 
//and meta_name = 'user_like'
$current_data = ....;
$array_data = array();
$array_data[$user_id] = array(
   'user_id' => $user_id
);

if( array_key_exists( $user_id, $current_data ) ){
    //user already like, ignore
}
else {
    //prefer to use + instead of array_merge,
    // in some cases array_merge make array data loose its array keys
    $current_data = $current_data + $array_data;
}

//save it back to meta table row
....

只是我的意见:)。

答案 3 :(得分:0)

你可以做到的一种方式......似乎你可能不会经常获得人们喜欢的东西,所以它可能更有意义而不是拥有多对多的关系,有一个包含useridobjectids的表,其中objectids是id的分隔列表。 IOW而不是

userid objectid
1      1
1      2
2      1
2      2

table user_likes_data
    userid objectids
    1      1,2
    2      1,2

然后

只有一个列的运行计数为objecti d所拥有的数量。将列添加到具有objectid的现有表或创建单独的表

tabe some_table 
    objectid num_likes
    1        2
    2        2

这样,在实践中,通常只需增加some_table.num_likes并附加到user_likes_data.objectid列表。 user_likes_data中的行数会少很多,整体使用的空间也会减少(因为每个喜欢的对象的单个单元格的分隔值比单个单元格的空间和开销要少)。在实际的指定页面上,您只需选择some_table.num_likes而不是尝试从user_likes_data计算

答案 4 :(得分:0)

添加一张表,比如说:

Likes
ID     ID_U     ID_O
1      5        7
2      5        9
3      5        11
4      4        7

其中: ID_U指的是投票的人的身份,ID_O表示对象。