哪种方法更适合基础和分拣速度?

Posted

技术标签:

【中文标题】哪种方法更适合基础和分拣速度?【英文标题】:Which method is more optimal for the base and sorting speed? 【发布时间】:2018-11-13 02:01:42 【问题描述】:

我目前有一个列表

@OneToMany(mappedBy = "movie", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@OrderBy("date ASC")
private List<MovieReleaseDateEntity> releaseDates = new ArrayList<>();

下载时的实体按日期排序。

但是,如您所知,List 不是最适合 JPA 的,建议使用Set。这就是为什么我有不同的想法

@OneToMany(mappedBy = "movie", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private SortedSet<MovieReleaseDateEntity> releaseDates = new TreeSet<>();

并实现Comparable

public int compareTo(MovieReleaseDateEntity o) 
    return this.date.compareTo(o.date);

哪种方式更好?第一个是List 还是第二个是Set

【问题讨论】:

【参考方案1】:

第一种方法(@OrderBy("date ASC"))在数据库级别排序,第二种方法在内存中使用 java 实现。如果返回的列表足够大,最好使用第一种方法。

如果返回的集合相当小并且您需要一些复杂的排序逻辑(但按特定字段排序不是您的情况),则使用 SortedSet 对实现 Comparable 的实体进行排序可能是合理的。

【讨论】:

例如,电影的其他标题的对象可以有,例如 max. 25左右。25大吗? 对我来说 25 绝对不是大尺寸。但如果大小约为 1000,它会变大:)【参考方案2】:

数据库旨在以优化的方式执行order by 命令,同时对order by 中使用的列进行索引。 因此,如果您可以调整表上的索引约束,您应该支持数据库的排序。

但是,如您所知,列表并不是最适合 JPA 和 建议使用 Set。

我宁愿说您不能在实体中滥用List 映射,因为出于合理的原因(基数),可接受的数量是有限的。

您还可以更简单地看待事情:如果您的元素很少,我想使用Set 可能是一种可以接受的性能方式。 否则,使用List 和由数据库完成的order by 可能会受到青睐。

无论如何,请使用对您的用例来说似乎最合适的结构(ListSet),然后在更改设计之前测量实际性能以希望获得更好的性能。

【讨论】:

我的应用程序中有 MovieReleaseDateEntity,它存储了首映日期。基于 IMDB 网站imdb.com/title/tt6644200/releaseinfo?ref_=tt_dt_dt#releases,这部电影有 53 个首映日期。所以我的列表上有 53 个 (MovieReleaseDateEntity) 对象。你是否认为有太多的对象无法排序到java中?我的应用程序类似于 IMDB。或者最好不要对对象进行排序并返回未排序的对象? 53 是相当少的排序元素。所以在java或数据库中,它不应该改变很多东西。请注意,您还应该考虑您检索的实体的数量以及包含此MovieReleaseDateEntity 列表的实体的数量。如果您检索 100 个这些实体,这可能很重要。在任何情况下都不要进行过早的优化。根据功能需求使用您需要的结构。与TreeSet 相比,List 更容易为客户端操作,并且消耗的内存更少。因此,我首先会支持这种方式,并且只有在不可避免的情况下才会重构为TreeSet

以上是关于哪种方法更适合基础和分拣速度?的主要内容,如果未能解决你的问题,请参考以下文章

EasyDL的哪种算法更适合你的图像分类应用

传统PC瓶颈凸显,哪种云桌面更适合税务部门?

ZenCart与osCommerce、OpenCart、PrestaShop哪种开设外贸网店更适合新手操作

哪种方法更适合此目的 commandLink 或 outputLink 或 Link [重复]

哪种 Windows IPC 方法更适合短命令?

故事板 Segue 与委派。哪种方法更适合在 ViewController 之间传递数据