Ecto查询具有最佳值的最佳做法

问题描述 投票:0回答:1

我正在编写一个简单的Web应用程序。在许多情况下,我需要从数据库中加载一些条目以及一些聚合字段(例如sumcount)。我正在辩论哪种是处理此类案件的更有效方法,我想到的选项是:

  1. 将这些值作为虚拟字段添加到我的架构中,并将它们合并到所选字段中,专业人士:

    • 性能-在一个查询中获取所有数据。
    • 信息的可靠性-所有信息都是通过DB中的原子操作获得的。

    cons:

    • 将字段添加到其含义与实体本质不同的架构(例如query_counttotals_sum等)。

    • 汇总值将返回散布在所有实体上,而不是获得一个值

  2. 运行两个单独的查询,一个查询检索数据,另一个查询汇总值(优点和缺点与选项1中的相反)。

    示例

  3. 选项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应用程序。在许多情况下,我需要从数据库中加载一些条目以及一些聚合字段(例如求和和计数)。我正在辩论哪种是更有效的应对方式...

elixir phoenix-framework ecto
1个回答
0
投票

帮助我退后一步的问题是:“我要呈现的页面真的只是Products的列表吗?”。或者,“除了我的list_products()函数的调用者之外,是否有人在乎query_total

如果答案为“否”,那么就不必发送完整的Product结构列表:

© www.soinside.com 2019 - 2024. All rights reserved.