[提煉&總結(jié)]ORM連接ODM

ORM:Object Relational Mapping。比較著名的有Django的ORM,SQLAlchemy。
ODM:Object Document Mapping,本質(zhì)也屬于一種ORM,不過是基于MongoDB、Redis這種NoSQL的。這個詞我感覺并不是業(yè)界通用的,首先在搜索引擎上,這個詞沒什么相關(guān)的結(jié)果;其次,MongoDB可以講Document,但是Redis就不合適了。我用過的有MongoDB的MongoEngine,Redis的Walrus。雖然這個詞某種意義上不準確,但下文為了方便還是使用它。

使用原生的NoSQL命令有時候很繁瑣,我們總會不自覺地對它們進行封裝。如果我們想要將一個ORM的對象及相關(guān)的一些方法運算結(jié)果保存在NoSQL中,如果可以通過類似ORM的操作,而不是逐個地去保存、獲取,是不是會方便一些?

關(guān)系

需要構(gòu)造的框架具體關(guān)系如圖。DataModel指的是ORM中的Model,CacheModel指的是ODM的Model,二者通過Binding來連接。

在DataModel和CacheModel中,定義Model和我們通常的做法完全一樣。

在Binding中,除去定義是哪兩個Model進行關(guān)聯(lián)外,最主要是要定義一個字典field_mapping,用來將兩個Model中的字段、方法一一對應(yīng)。

class Article(DataModel):
    id = IntegerField()
    title = CharField()
    description = TextField()
    create_date = DateField()
    image = ImageField()
    votes = Many2manyField('user')

    def get_vote_list(self):
        return [(user.id, user.name) for user in votes]

class ArticleCache(CacheModel):
    id = IntegerField()
    title = CharField()
    description = TextField()
    create_date = DateField()
    image = CharField()
    vote_list = ListField()

class ArticleBinding(Binding):
    data_model = Article
    cache_model = ArticleCache
    field_mapping = {
        'id': 'id',
        'title': 'title',
        'description': 'description',
        'create_date': 'create_date',
        'image': 'image.url',
        'vote_list': '.get_vote_list',
    }

大體上的定義方法如上所示,應(yīng)該說比較清晰的。

在具體去取數(shù)據(jù)時,需要DataModel提供一個方法,來獲取到對應(yīng)的CacheModel,這當然是需要通過Binding的。

以上是對使用者而言,對框架創(chuàng)建者,除了要提供以上所述的這些內(nèi)容外,最主要的是:

  1. 設(shè)計字段轉(zhuǎn)換方法,因為就算DataModel和CacheModel中都是DateField,但里面保存的內(nèi)容很可能是不同的。特別是很多ORM里面都有一些獨有的字段。對于One2Many,Many2One,Many2Many字段則不能直接轉(zhuǎn)換。
  2. 設(shè)計手動/自動更新機制,使用ODM肯定是需要要做好數(shù)據(jù)一致性,如果某些數(shù)據(jù)實時性比較強,經(jīng)常在變,那建議最好不要使用這種緩存框架,除非設(shè)計好符合業(yè)務(wù)場景的緩存刷新機制。一般而言,保存到ODM中的數(shù)據(jù)能夠保持一定時間不需要變化,這樣比較簡單。
  3. 設(shè)計過期機制。這個和第2點是相關(guān)的。

其實這樣搞下來,是有點臃腫的:一個模型對應(yīng)了兩個具體實現(xiàn),一般來講對應(yīng)一個也就夠了。所以這種框架的應(yīng)用場景估計也不會太廣吧。。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內(nèi)容

  • 原文地址 本文簡單的介紹了數(shù)據(jù)庫,以及如何在 Node/Express 中應(yīng)用他們。之后展示如何使用Mongoos...
    前端幼兒班閱讀 5,183評論 1 5
  • # Awesome Python [![Awesome](https://cdn.rawgit.com/sindr...
    emily_007閱讀 2,220評論 0 3
  • mongoose入門 MongoDB是一個開源的NoSQL數(shù)據(jù)庫,相比MySQL那樣的關(guān)系型數(shù)據(jù)庫,它更顯得輕巧、...
    huilegezai閱讀 4,467評論 0 14
  • 香是中國民俗生活中的一件大事,有三個特點極為引人注目: 一是普遍性,漢人燒香,少數(shù)民族絕大多數(shù)也燒香,從南到北,從...
    張漪紋閱讀 1,482評論 0 8
  • 誰小的時候還沒做過瘋狂殺馬特的事情啊?比如說:追星。追星的對象廣泛存在于不同領(lǐng)域。小的時候不確定這樣一個詞的存在,...
    渡否閱讀 1,469評論 3 2