mindplay / jsondoc
基于JSON的对象/文档存储
Requires
- php: >=5.3.0
- mindplay/jsonfreeze: >= 1.2
Requires (Dev)
- phpunit/php-code-coverage: 2.*@dev
This package is auto-updated.
Last update: 2024-08-25 19:25:11 UTC
README
简单、基于文件的对象/文档数据库,使用JSON文件进行持久化。
概览
对象图被序列化并存储为JSON文档,在单独的文件中 - JSON表示(默认情况下可选)缩进并格式化为人可读和CVS友好的方式。
对象键直接映射到文件夹和文件名 - 例如,存储为foo/bar
的对象保存为{数据库名称}/foo/bar.json
。
使用基本事务语义提交写和删除操作,使用简单的数据库级锁定来防止同时写入,使用早期错误检测和自动回滚。
请参阅下方的“限制”以获取更多技术细节。
API
API由两个类组成
DocumentStore
代表与数据存储的“连接”:一个包含一个或多个数据库的根文件夹。
DocumentSession
代表数据存储内部特定数据库的会话 - 它管理对象的加载和保存,并尝试以事务性和安全的方式执行,例如原子提交所有保存/删除操作。
用法
使用FilePersistence创建DocumentStore并将其指向现有文件夹
$store = new DocumentStore(new FilePersistence($db_path));
要求DocumentStore创建DocumentSession
$session = $store->openSession();
这将锁定存储在共享模式下,直到你close()
会话。(如果超出范围也会自动关闭。)
现在创建任何类的对象并存储它们
$a = new Foo; $a->bar = 'Hello, World.'; $session->store($a, 'foo/bar');
请注意,对象的状态已捕获在内存中,但序列化的对象在提交更改之前不会写入底层存储。
或者,您可以在父ID下使用生成的UUID存储对象
$a = new Foo; $a->bar = 'Hello again!'; $id = $session->append($a, 'foo', $uuid); var_dump($uuid); // "029d97a2-7676-45b1-9d49-353bec0d71c0" var_dump($id); // "foo/029d97a2-7676-45b1-9d49-353bec0d71c0"
将数据库中的对象加载到当前会话中
$b = $session->load('foo/baz');
删除不需要的对象
$session->delete('foo/baz');
调用commit()
以持久化所有挂起的存储/删除操作
$session->commit();
最后,您应该close()
以显式释放锁
$session->close();
DocumentSession
API还提供了一些其他操作
-
exists($id)
指示存储中是否存在具有给定ID的文档。 -
contains($id)
指示会话中是否包含具有给定ID的文档。 -
getId($object)
提供会话中对象的文档ID。 -
evict($id)
将具有给定ID的对象/文档从会话中移除。 -
flush()
将所有对象/文档和挂起的操作从会话中移除。
限制
使用单独的平面文件进行数据存储是不快的 - 该库(按设计)优化了一致的存储、快速和简单的实现、人可读和VCS兼容的基于文件的存储,在速度不是关键因素的应用程序中。
JsonSerializer本身有一个重要的限制:它被设计用于存储自包含的对象图 - 它不支持共享或循环的对象引用。这是按设计,并与良好的DDD设计实践相一致:具有共享或循环引用的对象图没有清晰的事务边界,并且无法以可预测和一致的方式存储。
此库不合成对象键 - 这意味着您在存储新对象时必须分配一个键。这同样是按设计。
关于限制和技术的更详细背景这里。