0

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

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

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

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

我的问题是:

  1. 在性能方面是合理的解决方案吗?像这样的表会很大并且经常使用。;)

  2. 有没有更好的方法来做到这一点?

4

5 回答 5

2

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

2) 不是我知道的。

于 2013-02-08T18:16:58.970 回答
1
  1. 是的。删除/更新喜欢的内容不会有任何问题。正如 Arjun Khosla 所说,只是不要忘记添加密钥。

您的数据库结构可能如下所示

目的

ID  name
1   post
2   status

like_to_object

ID  objectID    userID  time
1   2           3       1231231231
2   1           5       1231231231
于 2013-02-08T18:22:04.093 回答
1

假设对象是一篇文章,并且有一个文章列表(唯一 id)的表 db,用户有自己的用户列表(唯一 id)表 db。就像 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
....

只是我的观点 :)

于 2013-02-08T18:44:26.913 回答
0

您可以这样做的一种方法...似乎您可能不需要经常访问人们喜欢的内容,因此与其建立多对多关系,不如建立一张桌子userid以及在objectids哪里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

然后

只是有一个列有多少喜欢和objectid 的运行计数。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

于 2013-02-08T18:12:58.447 回答
0

添加一个表,说喜欢:

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

其中: ID_U引用ID_O对象的投票者的 id。

于 2013-02-08T18:30:27.550 回答