Генерация динамических таблиц - PullRequest
1 голос
/ 31 октября 2009

Сначала позвольте мне описать мою ситуацию, чтобы вы могли помочь мне лучше. Есть две части.

1: У меня есть программа, которая запускает и анализирует кучу файлов. Он генерирует «отчет», который впоследствии будет передан на веб-сайт для хранения и просмотра БД. Этот отчет может содержать практически любые типы данных, поскольку пользователи могут запрашивать практически все. Я оставил это очень открытым концом.

2: Сайт анализирует этот отчет, добавляет запись о вещах, которые являются общими. Но также создает новую таблицу для любых новых данных, которые он находит. Он также хранит отображение из report_id на все эти динамически созданные таблицы. Например, если в отчете кто-то хочет рассчитать стандартное отклонение, и это имеет смысл для этого отчета, то будет таблица STD.

Сейчас этот сайт написан на PHP и выглядит немного грязно. Есть ли лучший способ сделать этот PHP. Кроме того, я подумываю переделать это в Rails, потому что это ради организации. Есть ли лучший способ в рельсах, "method_missing?".

Я не очень разбираюсь в создании веб-сайтов и не разбираюсь в БД, поэтому, пожалуйста, будьте добры.

Спасибо Eric

Ответы [ 3 ]

3 голосов
/ 01 ноября 2009

Похоже, у вас неструктурированные или, в лучшем случае, полуструктурированные данные. Классические реляционные таблицы БД не идеальны для этого, если вы не используете XML в качестве хранилища. Вы можете подумать о создании промежуточного языка определения отчета и последующем его сохранении в БД, обычно в формате XML. Сервер MS SQL, Oracle и DB2 поддерживают хранение и запрос данных XML.

Подумав немного ..
Вы также можете посмотреть на схему наблюдения и посмотреть, сможете ли вы адаптировать ее к этому примеру. Хотя шаблон является ОО, это можно сделать в SQL.
Это немного длинное объяснение, но я опубликовал упрощенную модель здесь ; Надеюсь, вы найдете это полезным.

observation_model_01

0 голосов
/ 01 ноября 2009

Автоматическое создание таблиц может причинить вам головную боль, если количество таблиц станет огромным. Списки каталогов в ext3 для каталогов с более чем 5000 элементов начинают казаться дорогими и, безусловно, довольно трудоемкими, когда вы получаете более 100 000 файлов. (MySQL CLI будет пытаться кэшировать все имена таблиц при подключении, и чтобы пропустить это, вам нужно подключиться с ключом -A.)

Вы можете рассмотреть возможность использования временных таблиц для создания отчета, а затем, возможно, уплотнить результаты в строку отчета для последующего извлечения. Или, как упоминает JP, структура таблицы, которая помечает значения и отчеты в одной таблице:

create table stddev (
    report_id int(11),
    field_name int(11), -- fk to field
    field_value double
);
create table reports (
    report_id int(11);
    report_name varchar(255);
);

И чтобы получить данные только для одного отчета, вы должны выполнить выборку, указав идентификатор_отчета:

select * from stddev where report_id = 123;

Я бы создал таблицы для имен отчетов, имен полей, и вы, вероятно, захотите отделить входные значения от производных / вычисленных значений, сохраненных для ваших отчетов.

В зависимости от того, как часто вы вводите новые данные, я бы не стал преждевременно оптимизировать от нескольких больших таблиц до множества маленьких таблиц. Правильно проиндексированная, большая таблица может работать хорошо.

Однако, какова величина данных, обрабатываемых этим приложением? Были ли причины использовать так много маленьких таблиц для начала?

Я использую PHP для обработки большого количества данных. Если ваша схема имеет смысл, это делает код PHP более понятным. Если бы это был я, я бы не переключился на другой язык программирования, я бы придерживался того, что начал, пока не наткнулся на реальное структурное ограничение языка; для меня переход на Rails был бы пустой тратой времени.

0 голосов
/ 01 ноября 2009

Изменение структуры вашей базы данных во время выполнения очень опасно. Я бы предложил хранить неизвестную или вновь обнаруженную информацию в таблице «смешанного» типа, где вы также можете указать «тег» информации для ее распознавания. Если вы встретите новый тип информации (например, стандартное отклонение), вы можете создать новый тег (немного похожий на расширение файла) и добавить информацию в информационную таблицу с тегом, связанным с ним. Если вы создаете новую таблицу, вы меняете схему и, следовательно, изменяете правила использования базы данных.

...