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的。
以上是对使用者而言,对框架创建者,除了要提供以上所述的这些内容外,最主要的是:
- 设计字段转换方法,因为就算DataModel和CacheModel中都是DateField,但里面保存的内容很可能是不同的。特别是很多ORM里面都有一些独有的字段。对于One2Many,Many2One,Many2Many字段则不能直接转换。
- 设计手动/自动更新机制,使用ODM肯定是需要要做好数据一致性,如果某些数据实时性比较强,经常在变,那建议最好不要使用这种缓存框架,除非设计好符合业务场景的缓存刷新机制。一般而言,保存到ODM中的数据能够保持一定时间不需要变化,这样比较简单。
- 设计过期机制。这个和第2点是相关的。
其实这样搞下来,是有点臃肿的:一个模型对应了两个具体实现,一般来讲对应一个也就够了。所以这种框架的应用场景估计也不会太广吧。。。
网友评论