非独特的多对多桌面设计

时间:2016-01-05 12:52:33

标签: mysql database database-design many-to-many voting

我正在为使用mysql的php项目实现投票系统。重要的是,由于统计原因,我必须分别存储每个投票行动。用户可以多次投票给多个项目,每次投票都有价值(想想它就像捐赠类似的东西)。 到目前为止,我有一张表投票,其中我计划用以下列存储投票:
user_id - 投票用户的ID,来自用户表的外键
item_id - 用户投票的项目的ID,项目表中的外键
计算 - 投票数# 已创建 - 投票日期和时间

我需要从表中得到的东西如下:项目的前X选民,用户投票的所有项目。

我的问题是:

  1. 这个表设计适合这项任务吗?如果是,我应该如何编入索引?如果没有,我哪里出错?
  2. 在这个旁边创建另一个表是否更有意义,该表具有用户项关系的唯一行(不是单独存储每个投票,而是更新计数行)?

1 个答案:

答案 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中出现,而您保留的列是您关心的。查询时更多herehere。)

  

如果是,我应该如何编制索引?

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)