是否有一个很好的方法来让孩子在MySQL作为一个数组?



首先,如果这是重复的,我真的不知道这个问题的最佳术语。

假设我有一个SQL模式,表示:

Businesses:
id: int
name: string
Employees:
id: int
business_id: int REFERENCES Businesses(id)
name: string

是否有任何可以想象的方式,我可以查询企业的每个与员工的数组附加作为一个字段的列表?目前,我正在将企业列表拉入服务器,然后对于数组中的每个企业,获取business_id等于其id的所有员工。这是有效的,但是对于大量的业务,它会导致对数据库的大量查询。

我考虑的另一个选项是将所有员工读入服务器上的内存,将它们放入[business_id->[employees]]的映射中,然后将员工数组发送到服务器上正确的业务employees字段。这似乎是一个性能更高的选择,但我想知道MySQL中是否有内置的东西允许我开箱即用,因为这似乎是一个相当常见的任务。谢谢你!

编辑:@MatBailie在这里提出了一个关于代码气味的观点,我只是想澄清这段代码的总体意图。我将添加一个一步一步的演练,从一个较高的层次来说明它会做什么。

  1. 从列表中选择所有公司
  2. 获取每个公司的所有员工
  3. 向用户显示公司列表,并在每个公司旁边显示每个员工的可滚动列表

我明白,正如@radocaw指出的那样,为企业获取员工列表是一个微不足道的连接,但我的问题是,这将需要多次访问数据库。我将在下面发布我目前在Golang中解决这个问题的方法,使用来自MySQL的两个简单的select和使用映射。这是给你的,@切向垂直!

    employeeMap := make(map[int][]Employee)
    employees,err := db.Query("SELECT business_id,f_name,l_name,email FROM employees")
    if err != nil {
        //handle error
    }
    for employees.Next(){
        var employee Employee
        err = employees.Scan(&employee.BusinessId,&employee.FName,&employee.LName,&employee.Email)
        if err != nil {
            //handle error
            continue
        }
        if _,ok := employeeMap[employee.BusinessId];ok{
            employeeMap[employee.BusinessId] = append(employeeMap[employee.BusinessId],employee)
        }else {
            employeeMap[employee.BusinessId] = make([]Employee,1)
            employeeMap[employee.BusinessId[0] = employee
        }
    }

用于构建企业id到员工列表的映射。接下来,我将从数据库中获取企业,并将该员工数组附加到它们的id上。

我不确定这是否是一个好方法,但它似乎比使用n连接命中数据库更优化和直接,其中n是企业的数量。感谢大家的反馈和高质量的回答/评论!

这里有几个微妙不同的问题。

第一个是:

  1. 是否有一个很好的方法来让孩子在MySQL作为一个数组?

答案:可能有一个方法——但它不可能是"好的"。

第二个是:

  1. 是否有任何可以想象的方式,我可以查询企业的每个与员工的数组附加作为一个字段的列表?

答案:在正常的环境中,企业列表中"附加一组员工作为字段"是不可想象的

第三个可能是:

  1. 在一个规范化的环境中,我如何将企业列表拉入我的服务器,然后,对于每个给定的企业,获得该企业所有员工的列表?

回答:这是一个简单的练习,通常使用join。如需进一步帮助,请参阅https://stackoverflow.com/help/minimal-reproducible-example

您可以通过使用group_concat:

返回CSV列表来实现类似的功能。
SELECT b.id,b.name,group_concat(e.id) employee_ids, group_concat(e.name) employee_names 
FROM businesses b 
LEFT JOIN employees e on b.id = e.business_id 
GROUP BY b.id,b.name

然后在代码中将值拆分为数组。

最新更新