我正在嘗試為我正在處理的數(shù)據(jù)應(yīng)用程序設(shè)計基本的ORM。關(guān)于我想出的模型的問題有兩個:這是數(shù)據(jù)庫跟蹤的“最佳”,“最高效”模型嗎?這是慣用的Go嗎?這個想法是在應(yīng)用程序啟動時將數(shù)據(jù)庫的完整模型加載到內(nèi)存中。使用此模型來生成具有每個對象的crc32哈希值的映射(對應(yīng)于數(shù)據(jù)庫中的一行)。這就是我們用來與模型進行比較的原因,以專門查找在調(diào)用.save()時進行了哪些更改。以下內(nèi)容的第一部分生成crc32映射,第二部分引入隨機更改,最后一部分將是.save()的一部分,以將db更改寫入磁盤編碼:func main() { // Read data off of disk into memory memDB := ddb // Create hash map of memDB peopleMap := make(map[int]uint32) for _, v := range memDB.people { // make row into byte array, looks kludgy hash := []byte(fmt.Sprintf("%#v", v)) peopleMap[v.pID] = crc32.ChecksumIEEE(hash) fmt.Printf("%v: %v %v \t(%v %v) - crc sum: %v\n", v.pID, v.fName, v.lName, v.job, v.location, peopleMap[v.pID]) } fmt.Println("\n# of people in memory:", len(memDB.people)) // Sometime later, we need to delete Danielle, so // Delete in memory: var tmpSlice []ddPerson for _, v := range memDB.people { if v.fName == "Danielle" { continue } tmpSlice = append(tmpSlice, v) } memDB.people = tmpSlice fmt.Println("# of people in memory:", len(memDB.people)) // Okay, we save in-memory representation mem.DB back // to disk with some kind of .save() assertion // a len(peopleMap) comparison to len(memDB.people) will // tell us there has been a change for INSERTS and // DELETES, but it won't tell us about updates or which // record was inserted or deleted // First, check for additions if len(peopleMap) < len(memDB.people) { // Code to find and add person to disk db ddb here fmt.Println("Adding someone to disk database...") } else if len(peopleMap) > len(memDB.people) { // Check for deletions fmt.Println("Purging someone from disk database...") }在以下位置有可用的版本:http : //play.golang.org/p/XMTmynNy7t
2 回答

浮云間
TA貢獻1829條經(jīng)驗 獲得超4個贊
您已經(jīng)實現(xiàn)了數(shù)據(jù)庫的內(nèi)存緩存,這與ORM并不是完全一樣的。
您所擁有的東西有幾個問題:
如果某個其他進程/應(yīng)用程序曾經(jīng)修改過數(shù)據(jù)庫,則您的內(nèi)存模型將過時。因為您不知道緩存是過時的,所以這可能會導(dǎo)致您對數(shù)據(jù)庫的破壞性寫入。
如果數(shù)據(jù)庫變大,您的應(yīng)用程序?qū)⑾鄳?yīng)變大。
大多數(shù)ORM提供了一種將類型(例如結(jié)構(gòu))映射到數(shù)據(jù)庫讀寫的方法。這使您可以從數(shù)據(jù)庫中讀取單個對象并對其進行修改,然后將該對象寫回到數(shù)據(jù)庫中。這可能是一個更好的方法。
至于您的慣用語言,我沒有看到明顯的非慣用語言,但是也沒有太多事情要做。最上面memDb := ddb
是一個函數(shù)調(diào)用,但是后面沒有括號。這是語法錯誤。
- 2 回答
- 0 關(guān)注
- 221 瀏覽
添加回答
舉報
0/150
提交
取消