mindplay/jsondoc

基于JSON的对象/文档存储

0.11.0 2015-06-05 19:40 UTC

This package is auto-updated.

Last update: 2024-08-25 19:25:11 UTC


README

简单、基于文件的对象/文档数据库,使用JSON文件进行持久化。

Build Status

Scrutinizer Code Quality

Code Coverage

概览

对象图被序列化并存储为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设计实践相一致:具有共享或循环引用的对象图没有清晰的事务边界,并且无法以可预测和一致的方式存储。

此库不合成对象键 - 这意味着您在存储新对象时必须分配一个键。这同样是按设计。

关于限制和技术的更详细背景这里