我有一個結構Person
:如何映射m:n與切片場的關係?
type Person struct {
Id int64
Name string
Colors []string
}
應當從person
表中獲取其數據:
id | name
---------
1 | Joe
2 | Moe
和person_color
表:
person_id | color
-----------------
1 | black
1 | blue
2 | green
通過SELECT p.id, p.name, pc.color FROM person AS p INNER JOIN person_color AS pc ON pc.person_id = p.id
我合併這兩個表到:
id | name | color
-----------------
1 | Joe | black
1 | Joe | blue
2 | Moe | green
此刻,我能想到的唯一的事情是將手動映射顏色,同時遍歷rows.Next()
(注:只是虛設碼):
ps := make([]People, 0)
rows, err := db.Query("SELECT ...")
for rows.Next() {
var p Person
err := rows.Scan(&p.Id, &p.Name, &p.Color[0])
exists := false
for _, ps := range ps {
if ps.Id == p {
exists = true
ps.Color = append(ps.Color, p.Color)
}
}
if !exists {
ps = append(ps, p)
}
}
雖然這樣的工作,這是很煩人因爲映射到切片字段是一種常見操作。
有沒有什麼辦法可以在sql或sqlx的所有切片字段上做出上述通用?
另一種通用的方法是拆分查詢。查詢名稱並使用空的「顏色」創建「人物」對象。然後查詢所有名稱的所有顏色,並將其添加到人員。這種方法擴展到多個外鍵,或稱爲「切片字段」,因爲你稱它們爲: – Andomar 2014-08-30 14:06:32
@Andomar嗯我認爲使用另一個查詢不會解決這個問題,因爲你仍然需要以某種方式減少返回的行。目前我認爲我們能做的最好的是一個'Peoples'類型,它有一個'Reduce()'方法,將所有'People'與相同的'People.Id'合併。但仍然懷疑對此有如此少的反應 - 對我來說似乎並不奇特:) – bodokaiser 2014-08-30 14:47:39
是的,這是一個[非常常見的問題](http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch) 。作爲一名老程序員,我的建議是不要花太多時間將數據從表格移動到對象。這個問題本身並不值得一提。 – Andomar 2014-08-30 15:35:26