我打算建立一个简单的"使用PHP的RESTful Web服务。我将提供API来访问我在Web服务器上收集的一些数据(通过JSON)。主数据表对于公共API方法是只读的,并且将由常规定时间隔的单独私有方法编写。用户可以将一些数据写入私有表。
我想避免 - 如果可能的话 - 添加处理数据库的复杂性(甚至不是SQLite);所以,我打算在磁盘上的文件序列化我的数据,并在调用PHP脚本时在内存中反序列化它们。
在每个PHP实例的内存中加载整个数据不会给Web服务器带来太大的负担(我希望)... (数字是这样的:主数据表大小计划最多为100k记录,每个记录的最大记录大小为1k字节,因此数据大小最大可能大小为100MB,通常大小为10MB;最大并发用户数永远不会高于100;这些数字是由设计,没有可能变得更大)。
问题是:我可以使用PHP关联数组对多个键执行查询吗?
一个例子:这是我简化的主要数据结构:
<?php
$data = [
"1" => [
"name" => "Alice",
"zip" => "12345",
"many" => "A",
"other" => "B",
"fields" => "C",
],
"2" => [
"name" => "Bob",
"zip" => "67890",
"many" => "X",
"other" => "Y",
"fields" => "Z",
],
// ...
];
?>
要按主键访问记录,当然,我应该这样做:
$key = "12345";
$record = $data[$key];
但是,如果我想(有效地,即避免顺序扫描......)通过不同的密钥访问一个或多个记录,请说&#34; zip&#34;?当然,这些键可能包含重复的值。我想出的唯一解决方案是为每个二级密钥构建一个新数组,以及#34; index&#34;,并将其与主数据表一起序列化......
例如:
$zip_idx = [
"12345" => [ "1", "355", "99999", ],
"67890" => [ "2", "732", ],
// ...
];
然后:
$zip = "67890";
$records = $zip_idx[$zip];
所以:
您是否认为此设计存在任何问题,不一致或缺乏灵活性?
您能提出更智能或更紧凑的解决方案吗?
您有任何考虑或反对意见吗?
答案 0 :(得分:1)
我不会为其他“索引”创建任何进一步的数组。
只需创建一个很好的类来处理查询。 zip的查询可能看起来像这样
class Data{
protected $data;
public function getByZip($zip){
return array_filter($this->getData(),function($item)use($zip){
if($item['zip'] == $zip) return true;
return false;
});
}
public function setData($data){
$this->data = $data;
}
public function getData($data){
return $this->data;
}
}
$dataArray = [
"1" => [
"name" => "Alice",
"zip" => "12345",
"many" => "A",
"other" => "B",
"fields" => "C",
],
"2" => [
"name" => "Bob",
"zip" => "67890",
"many" => "X",
"other" => "Y",
"fields" => "Z",
],
// ...
];
$data = new Data();
$data->setData($dataArray);
$result = $data->getByZip(12345);
你也可以在数组中使用userid并以这种方式查询。
问候
编辑:针对您的效果问题 - &gt; 正常情况下,您可以使用数据库获取可达100MB的数据。 原因是 - 如果您使用阵列文件数据库 - 必须将100MB的整个文件读入内存。这不是一个问题,但大多数提供商使用的最大内存限制为128MB,这可能会导致问题。