我想在FB中实现类似“喜欢它”的功能。
我希望用户能够简单地点击他们喜欢的对象下的按钮。只有正面投票。
事情是我想要记住,他们喜欢什么对象,所以我必须将它保存在我的数据库中。让我们说,只有一种类型的对象可以保持简单。
最简单的方法是创建一个表,它将实现多对多关系(用户对象)。
我的问题是:
在性能方面是否合理?像这样的表会非常大并经常使用。 ;)
有更好的方法吗?
答案 0 :(得分:2)
1)是的,确实如此。请记住在两个外键上保留索引(更好的是,将两个键都作为复合主键)
2)不是我所知道的。
答案 1 :(得分:1)
您的数据库结构可能如下所示
<强>对象强>
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 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
....
只是我的意见:)。
答案 3 :(得分: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
然后
只有一个列的运行计数为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
表示对象。