用于存储动态二维数组的 SQL 设计和/或 PHP 类?
Posted
技术标签:
【中文标题】用于存储动态二维数组的 SQL 设计和/或 PHP 类?【英文标题】:SQL design and / or PHP class for storing dynamic two-dimensional arrays? 【发布时间】:2009-04-29 08:46:32 【问题描述】:我需要一种优雅的方式来存储各种大小(x 和 y)的动态数组(基本上是没有所有功能的电子表格),主要用作 ENUM、列表、查找数据、价格表等。多语言将是一个很大的好处。速度之精华。
这是一个典型的“工作表”示例;
| 1 | 2 | 3 | 4
-------------------------------
model A | 2$ | 5$ | 8$ | 10$
model B | 3$ | 6$ | 9$ | 12$
model C | 4$ | 8$ | 10$ | 13$
所以,要获取信息,我会这样做;
$price = this_thing_im_after ( '3', 'model B' ) ;
echo $price ; // Prints '9$'
我在 php5 和 Zend 框架的世界中,但对设计和 SQL 的想法同样花哨,甚至来自外部世界、库、扩展等的建议,因为我不想重新发明太多的***。我最需要后端的东西,稍后我会为动态工作表编写一个 GUI。想法、想法、指针?
只是一个编辑指出我不想序列化和 blob 数据,因为我想查询索引和工作表,甚至可能是数据(或支持此类的人的类型,现在 太棒了!)如果我心情很疯狂。但同样,这对我来说不是一个破坏者;如果有人有一个不错的库或类,可以通过一些简单的查询快速序列化进出数据库,我很高兴。
【问题讨论】:
【参考方案1】:除了将整个内容序列化为一个 blob 字段之外,您最终可能会得到一个键/值表,其中您的键是 row 和 col 字段:
CREATE TABLE sheet (
sheet_id int not null,
name varchar(32),
rows int, -- stores max dimension if needed
cols int, -- stores max dimension if needed
primary key (sheet_id)
);
CREATE TABLE cells (
cell_id identity, -- auto inc field for ease of updates
sheet_id int not null, -- foreign key to sheet table
row int not null,
col int not null,
value smalltext, -- or a big varchar depending on need
primary key (cell_id), -- for updates
unique index (sheet_id, row, col), -- for lookup
index (value) -- for search
);
CREATE TABLE row_labels (
sheet_id int not null,
row int not null,
label varchar(32),
primary key (sheet_id, row)
);
CREATE TABLE col_labels (
sheet_id int not null,
col int not null,
label varchar(32),
primary key (sheet_id, col)
);
这使您可以很好地对数据进行切片:
// Slice [4:20][3:5]
SELECT row, col, value FROM cells
WHERE sheet_id = :sheet
AND row BETWEEN 4 AND 20
AND col BETWEEN 3 AND 5
ORDER BY row, col
while ($A = fetch())
$cell[$A['row'][$A['col']] = $A['value']; // or unserialize($A['value']);
【讨论】:
不错的方法!像这样的“解决方案”!【参考方案2】:是否需要仅获取电子表格的部分,或通过包含的数据进行查询?
如果您只想存储和检索整个内容,我会使用数组的明确文本表示(例如serialize()
)并将其存储为文本。
【讨论】:
好吧,我希望能逃脱序列化的地狱,如果我真的非常幸运的话,可以对数据进行索引,这样我就可以输入工作表键了。但是,是的,我可以简单地将它们全部序列化,并取消将它们放在数据库中以便于存储的整个概念。 :) 不过我已经考虑过了。 不知何故我不明白你的反对意见。 ;-) 将数据分解为您想要积极处理的最原子部分,并将这些部分存储在数据库中。出于性能原因,我建议不要使用工作表和单元格表解决方案,而且我无法想象您想要数据库中的单元格级别粒度。 是的,我不想要单元格级别的粒度,但我希望有键/标题/列名粒度。我也希望每张表都有多种类型,例如,只要求所有类型为“产品价格”的表。嗯,我猜,序列化糊状物中的动态字段可以做到这一点。 “标题/列名粒度”是什么意思?能够通过其名称获取行或列,或者只是检查它是否存在,然后获取整个工作表?没有什么反对将工作表类型或其他元数据存储在额外的列中。 如果您不想要单元格粒度并且不想要 blob,您想存储什么?以上是关于用于存储动态二维数组的 SQL 设计和/或 PHP 类?的主要内容,如果未能解决你的问题,请参考以下文章
第四周《C语言及程序设计》实践项目39 动态存储管理与动态数组的实现