Исходя из моего опыта, сохранение значения в виде строки вполне приемлемо, и самое простое / прямое при условии, что ...
- Вам никогда не придется искать по самому значению (невозможно использовать индекс)
- Вы не обрабатываете огромные (тысячи / миллионы) или записи сразу
Опция трех таблиц и UNION
имеет ограничение, которое вы, возможно, не заметили: столбец value
в представлении UNIONed не может быть разных типов данных. Они либо будут получены неявным образом (на основе типа поля в первом SELECT из UNION), либо представление просто не будет создано.
Моим вариантом этой идеи было бы иметь три поля значений вместо одного. Затем вы можете добавить отдельный индекс для каждого, иметь только одну таблицу, избегать необходимости в CAST и других преимуществах. Все за счет небольшой дополнительной сложности в таблице (я бы предпочел это здесь, а не запросы, использующие ее в любом случае), но также и при значительном увеличении используемого пространства.
Key, Type, Value_INT, Value_FLOAT, Value_DATE
EDIT:
О, и последний вариант. Не храните значения как строки, но храните их как числа с плавающей точкой. Все три типа данных, которые вы упомянули, могут храниться как числа с плавающей запятой, что позволяет использовать индекс.
SELECT * FROM mytable WHERE (type='date') AND (value < CAST("2010-01-01 00:00:00" AS FLOAT))
или
SELECT * FROM mytable WHERE (type='float') AND (value < 17.5)
или
SELECT * FROM mytable WHERE (type='int') AND (value < 17)