Стоит задача сделать сушность, которая может хранить розные данные. Хотелось бы реализовать модель Entity и Property так, чтобы Property мог хранить разные типы данные (аналог union c в С++).
Я вижу только один способ, создать таблицы выда property_*_values (где * — тип данные, как string, integer, float) и на основе типа в таблице properties делать динамический JOIN (реализация через inherited column). Возможно есть другие способы или готовые решения?
Использую PostgreSQL, от MongoDB пришлось отказаться.
Либо делать одну таблицу с множеством колонок
property | type | string_value | int_value | integer_value |…
и доставать данные в зависимости от содержимого колонки type
Ну либо плодить много таблиц для разных типов данных либо много столбцов. Второй вариант сильнее влияет на размер, но это зависит от кол-ва записей, если планируется хранить большие объемы пропертей то лучше наверно первый вариант выбрать
Ну честно я работал к комерчиским движками у них данная проблема решена так.
id | type | value
int | enum() | varchar(255)
Еще вижу подход такого типа
id|value varchar(255)
А уже программно определять тип, например в php есть методы is_integer(), is_float(), ..., is_array(), еще запарится для метода определения даты, майлов, телефонов, файлов… Для этого регулярные выражения помогут.
Мне кажется, что тут решение должно быть комбинированное. Данные сами можно просто сериализовать при хранение и не парится с разными типами и набором колонок. Но тогда для поиска по атрибутам нужно будет иметь какой-то отедльный сервер, например sphinx. Н