美文网首页
[提炼&总结]ORM连接ODM

[提炼&总结]ORM连接ODM

作者: 顾慎为 | 来源:发表于2018-07-27 11:39 被阅读41次

    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点是相关的。

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

    相关文章

      网友评论

          本文标题:[提炼&总结]ORM连接ODM

          本文链接:https://www.haomeiwen.com/subject/jmrwmftx.html