mysql - 非唯一的多对多表设计

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

我正在为一个使用 mysql 的 php 项目实现一个投票系统。重要的是,出于统计原因,我必须单独存储每个投票操作。用户可以多次为许多项目投票,每一次投票都有值(value)(可以把它想象成捐赠之类的东西)。 到目前为止,我有一个表 votes,我计划在其中存储以下列的选票:
user_id - 投票用户的ID,用户表中的外键
item_id - 用户投票的项目ID,项目表中的外键
count - 花费的票数
已创建 - 投票日期和时间

我需要从表格中取出一些东西,例如:某个项目的前 X 个投票者,用户投票的所有项目。

我的问题是:

  1. 这个表格设计是否适合这项任务?如果是,我应该如何索引它?如果不是,我哪里出错了?
  2. 在这个表旁边创建另一个表是否更有值(value),该表具有用户-项目关系的唯一行(不单独存储每个投票,但更新计数行)?

最佳答案

每个基表都包含从某些填充(命名)空白语句(也称为谓词)中做出真实语句的行。

-- 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 查询中基表谓词如何成为表的名称。)

Top X voters for an item, all the items that a user have voted for.

Is this table design suitable for the task?

可以使用该设计来询问该查询。但只有您才能知道“喜欢”那个查询是什么。您必须定义足够的表/谓词来描述您在每种情况下关心的一切。如果 Votes 记录了所有事件的所有相关信息的历史,那么它一定是合适的。查询“用户 User 已投票的所有项目”返回满足谓词的行

-- 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。)

If it is, how should I index it?

MySQL 自动索引主键。通常,索引列集是 JOIN ON,否则测试,GROUP BY 或 ORDER BY。 MySQL 5.7 Reference Manual 8.3 Optimization and Indexes

Would it be more rewarding to create another table beside this one, which has unique rows for the user-item relationship

如果您指的是一个用户项目表对于某些计数和创建,[user_id] 投票给 [item_id] spending [count] votes on [created] 并且您仍然想要所有个人投票然后您仍然需要投票,而该用户项目表只是 SELECT user_id, item_id FROM Votes。但是,如果您想询问尚未投票的人,则需要更多。

(not storing every vote separately, but update the count row)

如果您不关心个人投票,那么您可以有一个包含用户、项目和用户-项目组计数总和的表。但是,如果您想要投票,则可以使用 GROUP BY user_id, item_id & SUM(count) 以投票的方式表达用户项目总和表。

关于mysql - 非唯一的多对多表设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34612205/

相关文章:

sql - 表别名如何影响性能?

c# - Entity Framework 5.0 PostgreSQL (Npgsql) 默认连接工厂

mysql - 在 mysql 中索引非常长的文件路径的最佳方法

MySQL 触发器、 View 、单独的表或忠诚度积分的即时计算?

php - 合并并显示2个数据库和2个表

php - 如何在SQL中合并不同表的数据

php - 跨多个页面重用 session 变量

mysql - 如何在 Apache Mahout 中将现有的具有 n 列的 MySQL 表作为 MySQLJDBCDataModel?

sql - 如何将特定查询返回的所有数据存储在 SQL Server 2005/2008 中的单个字符串中的表中

mysql - 数据库规范化