[提炼&总结]ORM连接ODM

ORM:Object Relational Mapping。比较著名的有Django的ORM,SQLAlchemy。
ODM:Object Document Mapping,本质也属于一种ORM,不过是基于MongoDB、Redis这种NoSQL的。这个词我感觉并不是业界通用的,首先在搜索引擎上,这个词没什么相关的结果;其次,MongoDB可以讲Document,但是Redis就不合适了。我用过的有MongoDB的MongoEngine,Redis的Walrus。虽然这个词某种意义上不准确,但下文为了方便还是使用它。

使用原生的NoSQL命令有时候很繁琐,我们总会不自觉地对它们进行封装。如果我们想要将一个ORM的对象及相关的一些方法运算结果保存在NoSQL中,如果可以通过类似ORM的操作,而不是逐个地去保存、获取,是不是会方便一些?

关系

需要构造的框架具体关系如图。DataModel指的是ORM中的Model,CacheModel指的是ODM的Model,二者通过Binding来连接。

在DataModel和CacheModel中,定义Model和我们通常的做法完全一样。

在Binding中,除去定义是哪两个Model进行关联外,最主要是要定义一个字典field_mapping,用来将两个Model中的字段、方法一一对应。

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',
    }

大体上的定义方法如上所示,应该说比较清晰的。

在具体去取数据时,需要DataModel提供一个方法,来获取到对应的CacheModel,这当然是需要通过Binding的。

以上是对使用者而言,对框架创建者,除了要提供以上所述的这些内容外,最主要的是:

  1. 设计字段转换方法,因为就算DataModel和CacheModel中都是DateField,但里面保存的内容很可能是不同的。特别是很多ORM里面都有一些独有的字段。对于One2Many,Many2One,Many2Many字段则不能直接转换。
  2. 设计手动/自动更新机制,使用ODM肯定是需要要做好数据一致性,如果某些数据实时性比较强,经常在变,那建议最好不要使用这种缓存框架,除非设计好符合业务场景的缓存刷新机制。一般而言,保存到ODM中的数据能够保持一定时间不需要变化,这样比较简单。
  3. 设计过期机制。这个和第2点是相关的。

其实这样搞下来,是有点臃肿的:一个模型对应了两个具体实现,一般来讲对应一个也就够了。所以这种框架的应用场景估计也不会太广吧。。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • 原文地址 本文简单的介绍了数据库,以及如何在 Node/Express 中应用他们。之后展示如何使用Mongoos...
    前端幼儿班阅读 5,112评论 1 5
  • # Awesome Python [![Awesome](https://cdn.rawgit.com/sindr...
    emily_007阅读 2,107评论 0 3
  • mongoose入门 MongoDB是一个开源的NoSQL数据库,相比MySQL那样的关系型数据库,它更显得轻巧、...
    huilegezai阅读 4,393评论 0 14
  • 香是中国民俗生活中的一件大事,有三个特点极为引人注目: 一是普遍性,汉人烧香,少数民族绝大多数也烧香,从南到北,从...
    张漪纹阅读 1,178评论 0 8
  • 谁小的时候还没做过疯狂杀马特的事情啊?比如说:追星。追星的对象广泛存在于不同领域。小的时候不确定这样一个词的存在,...
    渡否阅读 1,321评论 3 2