[提炼&总结]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的操作,而不是逐个地去保存、获取,是不是会方便一些?

[提炼&总结]ORM连接ODM_第1张图片
关系

需要构造的框架具体关系如图。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)