跳转到主要内容

版本化领域模型框架。

项目描述

关于

版本化领域模型(vdm)是一个允许您以类似于源代码版本控制系统(如subversion)允许您对代码进行版本控制的方式对领域模型进行版本控制的软件包。特别是,版本化领域模型对整个模型进行版本控制,而不仅仅是单个领域对象(有关此区别的更多信息,请参见下文)。

目前,该软件包作为SQLAlchemy的扩展提供(针对v0.4-v0.8进行了测试)。

该库非常稳定,自v0.2版本(2008年5月)以来,作者已在生产系统中使用。

作者

Rufus Pollock(开放知识基金会) - http://rufuspollock.org/ http://www.okfn.org/

完整的版本化域模型

为了允许一次涉及多个对象的“原子”更改,并便于遍历域对象,有必要引入一个显式的“修订”对象来表示对域模型的单次更改。

还需要引入“状态”的概念。这使我们能够使(一些)域对象具有状态,特别是那些要版本化的对象(状态是支持删除/撤销功能以及实现版本化多对多关系的必要条件)。

对于每个版本化的原始域对象,我们最终会得到2个域对象

  • “连续性”:原始域对象。

  • “版本/修订”:该域对象的版本/修订。

通常,用户不需要(明确地)关注版本/修订对象,因为他们只需与原始域对象交互,而原始域对象将在必要时“代理”请求到“版本/修订”。

以下是一个伪代码示例,以展示所有这些

# We need a session of some kind to track which objects have been changed
# In SQLAlchemy can use its Session object
session = get_session_in_some_way()

# Our Revision object
rev1 = Revision(author='me')
# Associate revision with session
# Any given session will have a single associated revision
session.revision = rev1

# Book and Author are domain objects which has been made versioned using this library
# Note the typo!
b1 = Book(name='warandpeace', title='War and Peacee')
b2 = Book(name='annakarenina', title='Anna')
# Note the duplicate!
b3 = Book(name='warandpeace')
a1 = Author(name='tolstoy')

# this is just shorthand for ending this revision and saving all changes
# this may vary depending on the implementation
rev1.commit()
timestamp1 = rev1.timestamp

# some time later
rev2 = Revision(author='me')
session.revision = rev2

b1 = Book.get(name='warandpeace')
# correct typo
b1.title = 'War and Peace'
# add the author
a1 = Author.get(name='tolstoy')
b1.authors.append(a1)
# duplicate item so delete
b3.delete()
rev2.commit()

# some time even later
rev1 = Revision.get(timestamp=timestamp1)
b1 = Book.get(name='warandpeace')
b1 = b1.get_as_of(rev1)
assert b1.title == 'War and Peacee'
assert b1.authors == []
# etc

代码实践

要查看一些实际代码的示例,请查看,针对SQLAlchemy

vdm/sqlalchemy/demo.py
vdm/sqlalchemy/demo_test.py

一般概念性文档

一个很好的起点是Fowler的《随时间变化的事物模式》

https://martinfowler.com.cn/eaaDev/timeNarrative.html

特别是时间对象

https://martinfowler.com.cn/eaaDev/TemporalObject.html

两种可能的方法

  1. (更简单)版本化域对象独立版本化(类似于维基)。这更像是普通的版本化域对象,而不是版本化的“域模型”。

  2. (更复杂)有显式的“修订”对象,每个修订中可以同时更改多个对象(原子性)。这是一个真正的版本化域模型

备注:使用第一种方法,它

  • 不可能支持版本化多对多链接。

  • 不可能一次性更改多个对象 – 那就是作为一次原子更改的一部分

  • 难以支持域模型遍历,即在某“修订”/时间点的域模型导航能力。

  • 更多关于局限性的讨论可以在该线程[1]中找到。

[1]:<http://groups.google.com/group/sqlelixir/browse_thread/thread/50aee902ce3555fb/>

版本化域模型(vdm)包专注于支持第二种情况(这显然包括第一种情况作为子情况),因此得名。

用例

SA = 在SQLAlchemy中实现

  1. (SA) 简单版本化对象的CRUD(除了HasA之外的引用)

2. (SA) 多对多和多对一关系的版本化,其中相关对象之一或两个是版本化的。

  1. (SA) 上面的撤销删除。

  2. (SA) 上面的清理。

  3. (SA) 在单个提交中更改多个对象的支持。

  4. (SA) 在HEAD和“过去”时一致的域对象遍历。

7. (SA) 对版本化对象进行差异支持,并为给定修订列出更改。

  1. 并发检查

  1. 同时编辑域模型的不同部分

  2. 同时编辑域模型的相同部分(冲突解决或锁定)

    1. Alice和Bob都获得了对象X

    2. Bob更新了对象X并提交(A的X现在已过时)

    3. 爱丽丝更新对象X并提交

    4. 冲突!!

    以下方式可以解决此问题:

    1. 锁定

    2. 合并

    而不是总结所有情况,只需查看Fowler关于并发的说明

  1. 支持挂起更新(因此更新必须批准后才能可见)

  1. 未经批准的用户进行了更改

  2. 此更改被标记为挂起

  3. 此更改通知了管理员

  4. 管理员允许或禁止更改

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码发行版

vdm-0.15.tar.gz (33.1 kB 查看哈希值)

上传时间 源代码

支持者