ua1-labs / firesql
通过将其转换为NoSQL数据库来点燃您的SQL数据库。
Requires
- php: >7.1.0
Requires (Dev)
- ua1-labs/firebug: 2.*
- ua1-labs/firedi: 2.*
- ua1-labs/firetest: 2.*
README
通过将其转换为NoSQL数据库来点燃您的SQL数据库!
目录
为什么在关系型数据库上构建NoSQL功能?
大多数关系型数据库的问题在于它们的模式会妨碍您快速修改数据结构。维护关系型数据库的一个主要问题是,在更新模式时,您还需要发布和管理更新脚本,如果它们以错误的顺序安装或无法运行,可能会破坏系统。维护这些系统可能会变得成本高昂。像WordPress这样的项目能够通过主要坚持从项目开始就维护的相同数据库数据结构来规避这些问题。多年来,WordPress对其启动时携带的数据模式的变化很小。
入门
将FireSQL安装到您的项目中
FireSQL已在Composer中注册。您可以使用以下命令使用composer安装它:
composer require ua1-labs/firesql
连接到数据库
要将FireSQL连接到您的数据库,您必须在FireSQL类的实例化时提供一个标准的PHP PDO对象。注意:目前,FireSQL支持的唯一两种数据库类型是MySQL和SQLite。
$pdo = new \PDO('sqlite:' . __DIR__ . '/demo.db');
$db = new \UA1Labs\Fire\Sql($pdo);
获取集合
在某个时刻,您将想要与数据库中的数据交互。无论是插入、更新、删除还是读取该数据。在NoSQL或非关系型数据库的概念中,我们将对象捆绑在一起,我们称之为“集合”。集合是存储类似对象的地方。请注意,对象模式无关紧要,当您存储具有相似模式性质的对象时,查询它们会更容易。
在获取集合时,您不需要注册它。只需通过名称请求它,FireSQL就会返回一个对象,该对象将有权访问您请求的集合。
$collection = $db->collection('CollectionName');
集合选项
在请求集合时,您可以通过传递选项来启用集合的某些功能。
$options = [
'versionTracking' => true,
'model' => 'MyCollectionModel'
];
$collection = $db->collection('CollectionName', $options);
可用选项
| 选项 | 描述 | 值类型 | 默认值 |
|---|---|---|---|
| versionTracking | 在集合中的对象上打开版本跟踪。因此,每当对象被更新或删除时,集合中对象的所有过去值都始终会有一个追踪。 | 布尔型 | false |
| model | 将设置集合表示的对象类型。当你设置此选项时,无论何时插入或更新对象,如果对象不是你设置的类型,将会抛出一个SqlException。另外,当你检索对象时,你将得到相应的对象类型。 | 字符串或null | null |
插入第一个对象
在FireSQL中处理对象时,你可以在集合中插入任何对象。你不必担心对象的模式。当你将对象插入集合时,FireSQL将尝试将对象序列化为JSON字符串并将其存储为记录。每个记录都存储了其他信息,以及一个索引,以便我们稍后检索该对象。
插入对象
$vehicle = new Vehicle();
$vehicle->setMake('Honda');
$vehicle->setModel('CRV');
$vehicle->setType('SUV');
$insertedObject = $carCollection->insert($vehicle);
请注意,$insertedObject不再是Vehicle的实例。相反,它是一个stdClass的实例,因为FireSQL不维护实例对象。而是,只包含对象内的公共数据。
此外,当对象存储在数据库中时,作为存储对象的一部分,每个对象都将增加4个字段,这些字段将提供有关对象及其在数据库中存储方式的信息。
$insertedObject->__id; // the unique ID the object was stored as
$insertedObject->__revision // the revision number of the object
$insertedObject->__updated // the datetime the object was updated
$insertedObject->__origin // the datetime the object was first stored in the database
更新对象
更新对象基本上与插入对象的过程相同。实际上,在幕后,它使用更新和插入的相同逻辑。唯一的区别是,在更新时,你提供一个ID,指定你将更新哪个对象。
$updatedObject = $carCollection->update($id, $vehicle);
删除对象
删除对象非常简单。它们通过ID进行删除。
$collection->delete($id);
获取对象计数
查找对象
FireSQL最复杂的部分实际上是在插入对象之后从数据库中检索对象。大多数情况下,大多数搜索都很容易实现。因此,首先我们将讨论从数据库中检索记录的简单方法。然后,我们稍后会讨论如何使用高级过滤来执行更复杂的搜索。
对象索引
为了实现搜索集合中对象的能力,每当集合中插入或更新对象时,FireSQL将根据一级公共成员对对象进行索引。在此阶段,索引提供了通过简单比较进行搜索的能力。我们没有任何意图在FireSQL中实现深层次对象索引。只有当值位于对象的根级别,并且它是字符串、整数、null或布尔值时,它才是可索引的。目前不支持其他数据类型。
通过ID获取对象
这是从数据库中获取对象的最简单方法。通过搜索你已知的ID。
$object = $collection->find($id);
上述方法调用将根据给定的ID从数据库中返回单个对象。如果集合不包含具有给定ID的对象,则返回null。
通过简单过滤获取对象
简单过滤是一个创建的概念,允许用户传递表示搜索的JSON字符串。这些JSON字符串直接表示我们试图匹配的对象。
直接比较
如果您想找到集合中所有具有精确值的对象,以下示例将为您提供如何实现这一点的思路。在示例中,您会发现我们正在请求所有对象,其等同于 $obj->name = 'josh'
$search = '{"name":"josh"}';
$objects = $collection->find($search);
其他比较类型
FireSQL简单过滤器还支持使用除直接比较之外的其他比较类型。在以下示例中,我们想要检索所有包含大于5的$num的对象。
$search = '{"num":">5"}';
$objects = $collection->find($search);
支持的比较
| 比较 | 示例 |
|---|---|
| 等于 | {"name":"josh"} 或 {"name":"=josh"} |
| 不等于 | {"name":"<>josh"} |
| 大于 | {"num":">5"} |
| 大于等于 | {"num":">=5"} |
| 小于 | {"num":"<5"} |
| 小于等于 | {"num":"<=5"} |
AND逻辑
简单过滤器还支持AND逻辑,您可以组合多个比较。以下示例将返回所有集合中具有$obj->name = 'josh'和$obj->num不等于5的对象。
$search = '{"name":"josh", "num":"<>5"}';
$objects = $collection->find($search);
OR逻辑
OR逻辑与AND逻辑一样简单。使用OR逻辑,您只需将不同对象中的比较组合在一起。以下示例将返回一个名称设置为"josh"或"steve"的对象集合。
$search = '[{"name":"josh"},{"name":"steve"}]';
$objects = $collection->find($search);
魔法过滤器方法
简单过滤器内置的概念是能够在返回之前进一步操作对象集合。以下将找到每个方法和如何操纵集合设置的描述。
| 方法 | 描述 | 示例 |
|---|---|---|
| length | 此方法设置您希望从整个集合中返回的对象数量 | {"length": "100"} |
| offset | 此方法设置数据集应该偏移多少 | {"offset": "10"} |
| order | 此方法指定数据集将按哪个字段排序 | {"order": "field"} |
| reverse | 此方法将确定是否应该将顺序反转为其自然升序 | {"reverse": true} |