我正在为使用mysql的php项目实现投票系统。重要的是,由于统计原因,我必须分别存储每个投票行动。用户可以多次投票给多个项目,每次投票都有价值(想想它就像捐赠类似的东西)。
到目前为止,我有一张表投票,其中我计划用以下列存储投票:
user_id - 投票用户的ID,来自用户表的外键
item_id - 用户投票的项目的ID,项目表中的外键
计算 - 投票数#
已创建 - 投票日期和时间
我需要从表中得到的东西如下:项目的前X选民,用户投票的所有项目。
我的问题是:
答案 0 :(得分:0)
每个基表都包含从一些填充(命名)空白语句(即谓词)中生成真实语句的行。
-- user [userid] has name ...
-- User(user_id, ...)
SELECT * FROM User
-- user [user_id] voted for item [item_id] spending [count] votes on [created]
-- Votes(user_id, item_id, count, created)
SELECT * FROM Votes
(注意谓词的简写如何就像它的表的SQL声明。注意在SQL查询中如何将基表谓词变成表的名称。)
项目的前X选民,用户投票的所有项目。
这个表设计是否适合这项任务?
可以使用该设计询问该查询。但只有你才能知道那些“喜欢”的查询。您必须定义足够的表/谓词来描述您在任何情况下关注的所有内容。如果Votes记录有关所有事件的所有相关信息的历史记录,那么它必须是合适的。查询“用户用户已投票的所有项目”返回满足谓词的行
-- user User voted for item [item] spending some count on some date.
-- for some count & created,
user User voted for item [item_id] spending [count] votes on [created]
-- for some count & created, Votes(User, item_id, count, created)
-- for some user_id, count & created,
Votes(user_id, item_id, count, created) AND user_id = User
SELECT item_id FROM Votes WHERE user_id = User
(注意在SQL中,条件如何在WHERE中出现,而您保留的列是您关心的。查询时更多here和here。)
如果是,我应该如何编制索引?
MySQL自动索引主键。通常,索引列设置您加入ON,否则测试GROUP BY或ORDER BY。 MySQL 5.7 Reference Manual 8.3 Optimization and Indexes
在这个旁边创建另一个表是否更有意义,该表具有用户项关系的唯一行
如果您指的是用户项目表for some count & created, [user_id] voted for [item_id] spending [count] votes on [created]
并且您仍然需要所有单独的投票,那么您仍然需要投票,而该用户项目表只是SELECT user_id, item_id FROM Votes
。但是如果你想问一下没有投票的人,你需要更多。
(不单独存储每个投票,但更新计数行)
如果您不关心个人投票,那么您可以拥有一个包含用户,项目和用户项目组计数总和的表格。但是如果你想要投票那么那个用户项目总和表可以使用GROUP BY user_id, item_id
&表示投票。 SUM(count)
。