【问题标题】:Getting related data in a list获取列表中的相关数据
【发布时间】:2012-07-03 03:42:57
【问题描述】:

我想打印一个数据库表中的项目列表,以及每个相关子项目的小列表(最多 10 个项目)。

例如,我有这两张表:

ITEMS

id: integer
name: string


SUBITEMS

id: integer
name: string
item_id: integer

所以,一个项目可以有很多子项目。

我想打印这样的东西:

Item 1
this item has: subitem 1, subitem 2, subitem 3

Item 2
this item has: subitem 4, subitem 5, subitem 6

Item 3
this item has: subitem 2, subitem 4, subitem 7

考虑到性能,我如何才能做到这一点?正如我所说,每个项目可以有很多子项目,但我最多会显示 10 个。

如果我使用连接进行选择,我认为当分页时,例如每页 25 个项目和 100 个用户查询时,它可能会给数据库带来太大压力。所以,我认为这不是一个好的解决方案。

我想到了一个解决方法,有些脏:向 ITEMS 表添加一个名为 subitems_summary 的新字段(文本类型),每次将子项分配给一个项目时,我都会选择加入两个表,并将结果存储在那里,以便我稍后可以格式化该字段中的数据。例如,在上面的清单中,项目 3 的 subitems_summary 字段将是:“subitem 2; subitem 4; subitem 7”。

你怎么看?

【问题讨论】:

  • 考虑一下您的“肮脏变通办法”不仅对 select 的性能有什么作用,而且对单个子项也有插入、更新和删除的作用。
  • 我会使用 select * 并仅遍历结果集并打印非空值

标签: database performance


【解决方案1】:

除非您的项目表确实很大,否则连接将足够快地完成此操作。这是最干净的解决方案,因此您应该首先实施。然后你可以测量性能,看看它是否真的太慢了​​。我想你会发现它会足够快。如果没有,您还可以尝试为在您所做的查询中经常使用的列添加索引。这将为 DBMS 提供更强大的优化选项,供其选择。

您的 DBMS 通常非常擅长优化此类查询,因此在进行自定义优化之前,您应该先了解它的查询速度有多快。

【讨论】:

  • 好吧,我认为除非我使用子查询,否则我无法获得所需的东西。而这要求更高。
【解决方案2】:

由于我没有得到更多答案,我将发表我的意见。

正如 Oleksi 所说,DBMS 足以运行联合查询。这可能适用于访问者数量少的情况。但是要注意缩放,这不是处理复杂事情的优化方式。

我认为我很想阅读一些有趣的技术,但我更倾向于从一开始就优化查询,至少是一点点。在我看来,故意使用连接不是一个好主意。出于这个原因,在专业网站中最好复制字段。

无论如何,为了实现我的要求,我会这样做:https://stackoverflow.com/a/11301759/267705

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 1970-01-01
    • 2020-12-04
    • 2020-12-05
    • 2021-09-06
    • 2014-07-29
    • 2018-11-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多