Генерация динамических таблиц
Сначала позвольте мне описать мою ситуацию, чтобы вы могли помочь мне лучше. Есть две части.
1: у меня есть программа, которая запускает и анализирует кучу файлов. Он генерирует "отчет", который впоследствии будет передан на веб-сайт для хранения и просмотра БД. Этот отчет может содержать практически любые типы данных, поскольку пользователи могут запрашивать практически все. Я оставил это очень открытым концом.
2: веб-сайт анализирует этот отчет, добавляет запись для общих вещей. Но также создает новую таблицу для любых новых данных, которые он находит. Он также хранит отображение из report_id во все эти динамически созданные таблицы. Например, если в отчете кто-то хочет рассчитать стандартное отклонение, и это имеет смысл для этого отчета, то будет таблица STD.
Прямо сейчас этот сайт написан на PHP и выглядит немного грязно. Есть ли лучший способ сделать этот PHP. Кроме того, я подумываю переделать это в Rails, потому что это ради организации. Есть ли лучший способ в рельсах, "method_missing?".
Я не очень разбираюсь в создании веб-сайтов и не очень разбираюсь в БД, поэтому, пожалуйста, будьте добры.
Спасибо Эрик
3 ответа
Похоже, у вас есть неструктурированные или, в лучшем случае, полуструктурированные данные. Классические реляционные таблицы БД не идеальны для этого, если вы не используете XML в качестве хранилища. Вы можете подумать о том, чтобы создать промежуточный язык определения отчетов и затем сохранить его в БД, обычно в формате XML. Сервер MS SQL, Oracle и DB2 поддерживают хранение и запрос данных XML.
После некоторого размышления..
Вы также можете посмотреть на схему наблюдения и посмотреть, сможете ли вы адаптировать ее к этому примеру. Хотя шаблон OO, это может быть сделано в SQL.
Это немного длинное объяснение, но я опубликовал здесь упрощенную модель; Надеюсь, вы найдете это полезным.
Изменение структуры вашей базы данных во время выполнения очень опасно. Я бы предложил хранить неизвестную или вновь обнаруженную информацию в таблице "смешанного" типа, где вы также можете указать "тег" информации для ее распознавания. Если вы встречаете новый тип информации (например, стандартное отклонение), вы можете создать новый тег (немного похожий на расширение файла) и добавить информацию в информационную таблицу с тегом, связанным с ним. Если вы создаете новую таблицу, вы меняете схему и, следовательно, вы меняете правила использования базы данных.
Автоматическое создание таблиц может причинить вам головную боль, если количество таблиц станет огромным. Списки каталогов в 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);
);
И чтобы получить данные только для одного отчета, вы должны сделать выборку, указав report_id:
select * from stddev where report_id = 123;
Я бы создал таблицы для имен ваших отчетов, имен полей, и вы, вероятно, захотите отделить входные значения от производных / вычисленных значений, сохраненных для ваших отчетов.
В зависимости от того, как часто вы вводите новые данные, я бы не стал преждевременно оптимизировать от нескольких больших таблиц до множества маленьких таблиц. Правильно проиндексированная, большая таблица может работать хорошо.
Однако какова величина данных, обрабатываемых этим приложением? Были ли причины для начала использовать так много маленьких таблиц?
Я использую PHP для обработки большого количества данных. Если ваша схема имеет смысл, это делает код PHP более понятным. Если бы это был я, я бы не переключился на другой язык программирования, я бы придерживался того, что начал, пока не наткнулся на реальное структурное ограничение языка; для меня переход на Rails был бы пустой тратой времени.