【发布时间】:2015-03-19 19:28:12
【问题描述】:
我将使用 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];
但是,如果我想(有效地,即避免顺序扫描......)通过不同的键访问一个或多个记录,比如“zip”,该怎么办?当然,这些键可能包含重复的值。我想出的唯一解决方案是为每个辅助键构建一个新数组以“索引”,并将其与主数据表一起序列化...
例如:
$zip_idx = [
"12345" => [ "1", "355", "99999", ],
"67890" => [ "2", "732", ],
// ...
];
然后:
$zip = "67890";
$records = $zip_idx[$zip];
所以:
您是否发现此设计存在任何问题、不一致或缺乏灵活性?
您能提出任何更智能或更紧凑的解决方案吗?
您有什么考虑或反对吗?
【问题讨论】:
标签: php multidimensional-array indexing