首先,如果这是重复的,我真的不知道这个问题的最佳术语。
假设我有一个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在这里提出了一个关于代码气味的观点,我只是想澄清这段代码的总体意图。我将添加一个一步一步的演练,从一个较高的层次来说明它会做什么。
- 从列表中选择所有公司
- 获取每个公司的所有员工
- 向用户显示公司列表,并在每个公司旁边显示每个员工的可滚动列表
我明白,正如@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是企业的数量。感谢大家的反馈和高质量的回答/评论!
这里有几个微妙不同的问题。
第一个是:
- 是否有一个很好的方法来让孩子在MySQL作为一个数组?
答案:可能有一个方法——但它不可能是"好的"。
第二个是:
- 是否有任何可以想象的方式,我可以查询企业的每个与员工的数组附加作为一个字段的列表?
答案:在正常的环境中,企业列表中"附加一组员工作为字段"是不可想象的
第三个可能是:
- 在一个规范化的环境中,我如何将企业列表拉入我的服务器,然后,对于每个给定的企业,获得该企业所有员工的列表?
回答:这是一个简单的练习,通常使用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
然后在代码中将值拆分为数组。