我想从数据库表中打印一个项目列表,并与每个项目一起列出一个相关子项目的小列表(最多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(类型为text),每次将子项分配给一个项目时,我都会选择加入两个表格,并在那里存储结果,以便稍后我可以格式化该字段中的数据。例如,在上面的清单中,第3项的subitems_summary字段为:“subitem 2; subitem 4; subitem 7”。
您怎么看?
答案 0 :(得分:0)
除非您的商品表真的很大,否则加入会足够快。这是最干净的解决方案,所以你应该先实现它。然后,您可以测量性能并查看它是否真的太慢。我想你会发现它足够快。如果没有,您还可以尝试向在您进行的查询中大量使用的列添加索引。这将为DBMS提供更强大的优化选项,可供选择。
您的DBMS通常非常擅长优化这些查询,因此在进入自定义优化之前,您应该看到它能够以多快的速度进行查询。
答案 1 :(得分:0)
由于我没有得到更多答案,我会发表我的意见。
正如Oleksi所说,DBMS足以运行联合查询。访问量较低时,情况可能如此。但是要注意缩放,这不是一种做复杂事情的优化方法。
我认为有一些我喜欢阅读的有趣技巧,但我更倾向于从一开始就优化查询,至少是一点点。在我看来,故意使用连接并不是一个好主意。在专业网站中,最好是因为这个原因复制字段。
无论如何,要实现我的要求,我会这样做:https://stackoverflow.com/a/11301759/267705