我想在firebase中定義一個模式,以防止某些子屬性爲空(如SQL中的NOT NULL約束)。Firebase數據庫規則:如何防止某個孩子被刪除(a.k.a NOT NULL)?
的模式應該是這樣的:
Property | allow null | type
---------+------------+--------
name | false | string
phone | false | string
alias | true | string
birthday | true | number (timestamp)
此外,只有用戶自己應該能夠讀取和寫入自己的聯繫人。
目前,該數據庫中有一些虛擬的數據:
{
"contacts" : {
"user1" : {
"contact1" : {
"alias" : "Bobby",
"name" : "Bob",
"phone" : "12312324"
}
}
}
}
,我想出了看起來像這樣的解決方案:
{
"rules": {
"contacts": {
"$user": {
"$contact": {
".read": "auth.uid == $user",
".write": "auth.uid == $user && newData.hasChildren(['name', 'phone'])",
"name": {
".validate": "newData.isString()"
},
"phone": {
".validate": "newData.isString()"
},
"alias": {
".validate": "newData.isString()"
},
"birthday": {
".validate": "newData.isNumber()"
},
"$other": {
".validate": "false"
}
}
}
}
}
}
這種方法的問題是,每次我想要修補某個值(例如別名),我必須提供非空屬性(不會更改),這是由於規則newData.hasChildren(['name', 'phone']
。
雖然我可以訪問我的應用程序中的整個對象,但這是一個令人討厭的不便之處。
有沒有更好的方法來解決這個問題?
Firebase沒有模式,因此通常最好不要在NoSQL數據庫上強制使用SQL概念 - 思考並設計NoSQL的結構!例如;試圖阻止某些兒童屬性爲空。爲什麼?如果數據不存在會發生什麼?如果你想確保它有數據,什麼數據? Firebase不允許使用空字符串,這意味着您需要將某些內容作爲子值佔位符。對於NoSQL,缺少子節點通常比佔位符好。用代碼處理這些案件; if!phoneChildNode.exists()然後讓phoneVar =「沒有電話提供」 – Jay