从日期排序的多个表中获取最后n条记录的有效方法(事件的用户日志)

时间:2016-07-17 08:56:11

标签: mysql database doctrine-orm

我需要从n表中获取最后m个记录(现在让我们说m = n = ~10)按日期排序(也支持偏移量)尼斯)。这应该向用户显示他的上一次活动。这些表将包含该用户的大部分数百或数千条记录。 我怎样才能以最有效的方式做到这一点?我正在使用Doctrine 2,这些表彼此没有关系。

我虽然对某些解决方案不确定最佳方法是什么:

  1. 创建单独的表并将记录放在那里。如果发生任何更改(如果用户在系统内部进行任何应在日志表中显示的更改),则会将其插入此表中。这应该是相当快的,但它很难管理,我不想使用这种方法。
  2. 从每个表中获取最后n个记录,然后对它们进行排序(从DB中排除)并限制为n。这看起来非常简单,但是有更多的表会有很高的开销。对于10个表,90%的记录将被丢弃。如果使用偏移,则会更糟。这也意味着m查询。
  3. 创建单个本机查询,并获取所有表的联合的最后id项的typen。像SELECT id, date, type FROM (SELECT a.id, a.date, 'a' AS type FROM a ORDER BY a.date DESC LIMIT 10 UNION b.id, b.date, 'b' AS type ORDER BY b.date DESC LIMIT 10) ORDER BY date DESC LIMIT 10一样。然后创建最多m个获取这些实体的查询。这应该比2.好一点,但需要原生查询。
  4. 有没有其他方法可以获取这些记录?

    谢谢

1 个答案:

答案 0 :(得分:0)

  1. 不难管理,它只是您为" action" -tables所做的每个插入的额外插入。
  2. 您也可以使用我猜测的触发器解决此问题,因此您甚至不必在应用程序代码中实现它。 https://stackoverflow.com/a/4754333/3595565

    1. 不会是每个表中的特定用户获得最后node-mongodb-native条记录吗?因此,我不认为这种方法存在很多问题,但我认为这是处理事情的最不理想的方法。

    2. 就像第二个选项,但数据库处理排序,使这种方法更加可行。

    3. 结论:(基于意见)

      您应该在选项1和3之间进行选择。主要问题应该是

      • 可以存储冗余数据

      • 可以在应用程序之外和数据库内部使用逻辑(触发器)

      使用日志记录表会使事情变得非常简单。但是你会复制数据。

      如果您可以使用触发器来填充日志记录表,事情就会变得更简单,但它有缺点,因为它需要额外的文档等等所以没有人想知道"数据在哪里来自?"