用于存储动态二维数组的 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 动态存储管理与动态数组的实现

JAVA中Vector怎样存放一个动态的二维数组

二维数组7:设计题,自己实现动态数组

PL/SQL数组

js如何定义二维数组,一维的key为动态值。就是要处理二级菜单显示。

创建动态二维数组