Database design 排序系统的模式/策略和查询

Database design 排序系统的模式/策略和查询,database-design,database-schema,Database Design,Database Schema,我的数据库中有以下模式: | items | CREATE TABLE `items` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `description` text COLLATE utf8_unicode_ci, `created_at` datetime DEFAULT NULL, `updated_at` date

我的数据库中有以下模式:

| items | CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `description` text COLLATE utf8_unicode_ci,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

| rankings | CREATE TABLE `rankings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `item_id` int(11) DEFAULT NULL,
  `rank` int(11) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
我基本上希望用户能够添加项目,并对它们进行排名。在我的系统中,管理员可以查看按平均排名排序的项目列表。我目前正在通过以下查询确定所有用户的平均排名:

SELECT AVG(r.rank) AS rank, i.* FROM rankings r LEFT OUTER JOIN items i ON r.item_id = i.id GROUP BY i.id ORDER BY rank ASC;
我正在努力解决的是,当一个新项目被添加并且还没有被任何用户排名时,如何创建一个查询或有一个插入策略。我认为有两种可行的策略:

1) 构造查询以获取所有用户的已排序列表,这样未排序的项仍会被记录,但可能会添加到按创建日期排序的每个用户的列表末尾

2) 添加新项目时,在排名表中为每个用户添加一行新项目,将其放在当前排名的最后


想法?

我不是mysql用户,所以两种语法中的一种适用于您。在
AVG
计算中使用
ifNull

SELECT AVG(ifNull(r.rank,0)) AS rank, i.* 
  FROM rankings r LEFT OUTER JOIN items i ON r.item_id = i.id
GROUP BY i.id
ORDER BY rank ASC;
或者,如果mysql不允许这样的函数嵌套:

SELECT AVG(s.rank) as avg_rank, s.*
  FROM ( SELECT ifNull(r.rank,0) AS rank, i.* 
           FROM rankings r LEFT OUTER JOIN items i ON r.item_id = i.id
         GROUP BY i.id ) as s
ORDER BY avg_rank ASC;

您可能还应该在表定义中的
排名.item_id
items.id
之间加入外键关系,并在DELETE CASCADE上添加
,我现在使用上面的选项2,即在添加新项目时为每个用户/项目组合创建一个排名行。我担心可伸缩性,但这已经足够了。

感谢您的输入标记,是的,我需要添加带有级联删除的外键关系。这无疑为我以后节省了一些时间。但是,您建议的查询对我来说并不太合适,因为它们没有考虑到一些用户尚未对其进行排名的项目。我想使用ifNull已经足够让我继续下去了。我很快会回来报告。+1只是为了在您的问题中包含正确的SHOW CREATE TABLE输出。谢谢,谢谢。