我想在 FB 中实现类似于“喜欢它”的功能。
我希望用户能够简单地单击他们喜欢的对象下的按钮。只投赞成票。
问题是我想记住,他们喜欢什么对象,所以我必须将它保存在我的数据库中。假设只有一种类型的对象可以保持简单。
最简单的方法是创建一个将实现多对多关系(用户到对象)的表。
我的问题是:
在性能方面是合理的解决方案吗?像这样的表会很大并且经常使用。;)
有没有更好的方法来做到这一点?
1) 是的,是的。请记住在两个外键上都保留索引(更好的是,将两个键都作为复合主键)
2) 不是我知道的。
您的数据库结构可能如下所示
目的
ID name
1 post
2 status
like_to_object
ID objectID userID time
1 2 3 1231231231
2 1 5 1231231231
假设对象是一篇文章,并且有一个文章列表(唯一 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 id
和meta_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
....
只是我的观点 :)
您可以这样做的一种方法...似乎您可能不需要经常访问人们喜欢的内容,因此与其建立多对多关系,不如建立一张桌子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
然后
只是有一个列有多少喜欢和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
添加一个表,说喜欢:
Likes
ID ID_U ID_O
1 5 7
2 5 9
3 5 11
4 4 7
其中:
ID_U
引用ID_O
对象的投票者的 id。