Задача такая: надо как-то хранить много (сотни тысяч) таблиц, структуры которых заранее неизвестны.
Навели на такую технику: EAV (
http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model). Как я понял, надо городить отдельную запись под каждое значение. Что-то оно мне не нравится, запросы все усложняются на ровном месте.
Читая про EAV натолкнулся на такую штуку, как Sparse columns (в MS SQL Server). С ними можно создать одну гигантскую таблицу (гигантскую как вширь, так и вглубь) с полями Int1, Int2 .. Int1000, Float1, Float2 .. Float1000, NVarchar255_1, NVarchar255_2 .. NVarchar255_1000. При этом колонки с суффиксами больше 3 можно пометить как SPARSE и NULL'ы в них перестанут жрать место за счет небольшого оверхеда для non-NULL'ов. В эту таблицу можно упихать все сотни тысяч таблиц, а маппинг вынести в отдельную таблицу.
Первый вопрос: а как эта же штука поддерживается в других СУБД? Oracle, PostgreSQL, Maria. Допустим, ARRAY из PostgreSQL. Это аналог? Можно ли его использовать в рамках описанной задачи?
Второй вопрос: какие подводные камни с перфомансом следует ожидать при таком подходе?
Третий вопрос: что делать с индексами? Хотелось бы в каждой из мелких таблиц дать возможность выбирать колонку для индексирования, но при таком подходе в индекс рано или поздно попадут все колонки.
Четвертый вопрос: кроме EAV и Sparse columns есть еще варианты?