我正在编写一个简单的Web应用程序。在许多情况下,我需要从数据库中加载一些条目以及一些聚合字段(例如sum
和count
)。我正在辩论哪种是处理此类案件的更有效方法,我想到的选项是:
将这些值作为虚拟字段添加到我的架构中,并将它们合并到所选字段中,专业人士:
cons:
将字段添加到其含义与实体本质不同的架构(例如query_count
,totals_sum
等)。
汇总值将返回散布在所有实体上,而不是获得一个值
运行两个单独的查询,一个查询检索数据,另一个查询汇总值(优点和缺点与选项1中的相反)。
示例
schema "product" do field :id, :string field :price :integer field :query_total, :integer, virtual: true end def get_data(query) do query |> select_merge([p], %{query_total: fragment("count(*) OVER()")}) |> Repo.all() end
选项2:
schema "product" do field :id, :string field :price :integer end def get_data(query) do query |> Repo.all() end def get_additional_data(query) do query |> exclude(:limit) |> exclude(:offset) |> select([cr], fragment("count(*) OVER()")) |> Repo.one() end
我正在编写一个简单的Web应用程序。在许多情况下,我需要从数据库中加载一些条目以及一些聚合字段(例如求和和计数)。我正在辩论哪种是更有效的应对方式...
帮助我退后一步的问题是:“我要呈现的页面真的只是Products
的列表吗?”。或者,“除了我的list_products()
函数的调用者之外,是否有人在乎query_total
?
如果答案为“否”,那么就不必发送完整的Product
结构列表: