Наше приложение будет создавать динамические формы для каждого пользователя.
Мы рассматриваем два подхода
a) Мы сохраняем данные всех пользовательских форм в одной таблице в виде пары ключ-значение, затем используем метод сводных таблиц извлекаем данные и выполняем фильтрацию, которая работает, но я думаю, что это может быть действительно огромным жадным ресурсом
b) Создание / Разработка таблицы для каждой формы, которую создает пользователь, которая соответствует ее дизайну, здесь нам не нужно поворачиваться, и мы получаем все преимущества mysql, а также у нас не будет объединений для более чем пары таблиц
Нашей главной заботой является масштабируемость, в сценарии «а», если таблица будет действительно огромной (что, очевидно, произойдет, если я рассмотрю регистрацию даже 1000 пользователей), с планом «b», если завтра наши таблицы будут расти вместе с нашим трафиком, который у нас может быть использовать MySQL кластер, но кластер имеет ограничения таблицы, как я прочитал здесь http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster-limitations-database-objects.html
Обновление
Новая идея поразила нас, почему бы не создать единую таблицу (как ключ, значение), которая соответствует одному элементу формы (текстовое поле, текстовая область и т. Д.), Используя соединение (Нет объединений = Нет полей) на основе формы определение, созданное пользователем, мы можем создать горизонтальные данные, не сводя на нет то, что вы все думаете об этой идее.
Обновление от 9 апреля 2011 года
Мы протестировали поворот против соединений
Сценарий - у нас есть форма с 7 полями, данные сохраняются как (пример данных для вставки одной формы)
------------------------------
| Key | Value |
------------------------------
| Key1 | Value1 |
| Key2 | Value2 |
| Key3 | Value3 |
| Key4 | Value4 |
| Key5 | Value5 |
| Key6 | Value6 |
| Key7 | Value7 |
------------------------------
Для сводного запроса потребовалось 0,92 секунды, чтобы развернуть 70000 строк в 10000 вставок формы
Для соединения потребовалось 17,63 секунды (woof .....), чтобы показать эти 10000 форм вставок
Мой стол
CREATE TABLE IF NOT EXISTS `vet` (
`id` int(11) NOT NULL,
`form_id` int(11) NOT NULL,
`key` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
KEY `id` (`id`),
KEY `form_id` (`form_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Сводный запрос
SELECT id,
GROUP_CONCAT(if(`key` = 'k1', value, NULL)) as 'key1',
GROUP_CONCAT(if(`key` = 'k2', value, NULL)) as 'key2',
GROUP_CONCAT(if(`key` = 'k3', value, NULL)) as 'key3',
GROUP_CONCAT(if(`key` = 'k4', value, NULL)) as 'key4',
GROUP_CONCAT(if(`key` = 'k5', value, NULL)) as 'key5',
GROUP_CONCAT(if(`key` = 'k6', value, NULL)) as 'key6',
GROUP_CONCAT(if(`key` = 'k7', value, NULL)) as 'key7'
FROM vet
WHERE form_id = 2
GROUP BY id
JOIN Query
SELECT v.id, v1.value as key1, v2.value as key2, v3.value as key3,
v4.value as key4, v5.value as key5, v6.value as key6, v7.value as key7
FROM vet v
LEFT JOIN vet v1 ON v1.id = v.id AND v1.`key` = "k1"
LEFT JOIN vet v2 ON v2.id = v.id AND v2.`key` = "k2"
LEFT JOIN vet v3 ON v3.id = v.id AND v3.`key` = "k3"
LEFT JOIN vet v4 ON v4.id = v.id AND v4.`key` = "k4"
LEFT JOIN vet v5 ON v5.id = v.id AND v5.`key` = "k5"
LEFT JOIN vet v6 ON v6.id = v.id AND v6.`key` = "k6"
LEFT JOIN vet v7 ON v7.id = v.id AND v7.`key` = "k7"
WHERE v.form_id = 2
GROUP BY v.id
Я думаю, что пока мы будем придерживаться системы разворота, пожалуйста, посмотрите мои запросы, если из-за них огромная разница.
Пожалуйста, предложите, какое решение лучше или есть другое лучшее решение
Sudesh