Mysql SQL连接与代码聚合

Mysql SQL连接与代码聚合,mysql,sql,foreign-keys,inner-join,query-performance,Mysql,Sql,Foreign Keys,Inner Join,Query Performance,我正在尝试开发从关系数据库(mysql)检索聚合信息的最佳方法。我有两张桌子:供应商和型号。两者之间的关系是一对多,即一个供应商可以有多个模型,而一个模型只能与一个供应商关联 从两个表中检索信息以便每个供应商都有其关联模型的最佳方法是什么?我的想法是制作一个REST API,这样它就可以有以下输出: { name: "one", description: "one description", models: [ { name: "o

我正在尝试开发从关系数据库(mysql)检索聚合信息的最佳方法。我有两张桌子:供应商和型号。两者之间的关系是一对多,即一个供应商可以有多个模型,而一个模型只能与一个供应商关联

从两个表中检索信息以便每个供应商都有其关联模型的最佳方法是什么?我的想法是制作一个REST API,这样它就可以有以下输出:

{
    name: "one",
    description: "one description",
    models: [
        {
            name: "one_model_1",
            price: 100
        },
        {
            name: "one_model_2",
            price: 200
        }
    ]
    ...
  • 通过在两个表之间建立联接进行检索。通过这种方式,将获得以下输出:

    select v.name as vendorName, v.description as vendorDescription, m.name 
    as modelName, m.price as modelPrice from vendor v inner join model m on 
    v.id = m.vendor_id;
    

    问题在于,需要执行代码处理,以将每个供应商元素与模型列表相关联。在这种情况下,来自数据库的信息将带来来自供应商的重复信息

  • 首先搜索所有供应商,然后循环搜索以检索相关模型。这里将出现问题N+1,因为需要一个查询来获取N个供应商,然后需要N个查询来检索模型

  • 首先搜索供应商。然后,从供应商ID中检索所有模型,并通过代码建立供应商模型关联


  • 我想知道什么是最好的解决方案。

    选项1将是您列出的选项中最有效的选项。需要最少的数据库调用次数(应用程序和数据库之间的往返次数最少)


    一次调用,文本操作在返回结果集之前完成。

    测试这两种方法,您将看到。在一对多联接中获取重复数据是正常的。如果您不想看到供应商重复出现,最好的解决方法是将其拉入某个报告工具中,您可以在其中抑制它或按您想要的方式对其进行格式化。通常,数据库在执行关联本身时非常有效。除非有严重的性能损失,否则我会选择选项1。此外,它需要更少的编程,出错的机会也更少。但是,如果您可以让SQL组合行以便返回更少的行,那就更好了。然后,在代码中,只需要解析组的文本,对吗?或者简单地以这种方式显示?你想要什么样的输出?是的,可以这样显示。但我说过,以防有必要处理这些信息并创建对象。
    SELECT v.Name, v.Description,
           GROUP_CONCAT(CONCAT(m.Name, ':', m.Price))
        FROM Vendors AS v
        JOIN Models AS m ON v.id = m.vendor_id
        GROUP BY v.Name, v.Description