SQL-дизайн и / или класс PHP для хранения динамических двумерных массивов?

Мне нужен элегантный способ хранения динамических массивов (в основном электронных таблиц без всякой функциональности) различных размеров (как 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 Framework, но мысли о дизайне и SQL так же денди, даже предложения в и из внешнего мира, libs, расширения и т. Д., Так как я не хочу изобретать слишком много колес , Мне больше всего нужен бэкэнд, и я буду писать графический интерфейс для динамических листов позже. Мысли, идеи, указатели?

Просто отредактируйте, чтобы указать, что я бы предпочел не сериализовывать и качать данные, поскольку я бы хотел запросить индексы и листы, возможно, даже данные (или тип для тех, кто поддерживает такие, теперь это было бы ужасно!), Если Я в безумном настроении. Но опять же, для меня это не прерыватель; если у кого-то есть хорошая библиотека или класс для быстрой и быстрой сборки из базы данных с помощью простого запроса, я все счастлив.

Solutions Collecting From Web of "SQL-дизайн и / или класс PHP для хранения динамических двумерных массивов?"

Помимо сериализации всего объекта в поле blob, вы, вероятно, получите таблицу ключей / значений, где ваш ключ – это строки и поля 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']); } 

Есть ли необходимость в получении только части таблицы или запроса по содержащимся данным?

Если вы просто хотите сохранить и получить все это, я бы просто использовал однозначное текстовое представление массива (например, serialize() ) и сохранил его как TEXT.