sdevalex
@sdevalex

Union с реляционными базами данных?

Стоит задача сделать сушность, которая может хранить розные данные. Хотелось бы реализовать модель Entity и Property так, чтобы Property мог хранить разные типы данные (аналог union c в С++).


Я вижу только один способ, создать таблицы выда property_*_values (где * — тип данные, как string, integer, float) и на основе типа в таблице properties делать динамический JOIN (реализация через inherited column). Возможно есть другие способы или готовые решения?


Использую PostgreSQL, от MongoDB пришлось отказаться.
  • Вопрос задан
  • 2458 просмотров
Решения вопроса 1
@solenko
Слайды под ваш вопрос www.slideshare.net/stepanyuk/implementation-of-eav-pattern-for-activerecord-models-13263311

Ну и готовых решений масса — осталось только выбрать
github.com/search?q=eav&repo=&langOverride=&start_value=1&type=Repositories&language=Ruby
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
kwikpik
@kwikpik
Developer
Либо делать одну таблицу с множеством колонок
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(), еще запарится для метода определения даты, майлов, телефонов, файлов… Для этого регулярные выражения помогут.

Но мне кажется это разумней чем мудрить с БД.
Ответ написан
Комментировать
mgyk
@mgyk
Мне кажется, что тут решение должно быть комбинированное. Данные сами можно просто сериализовать при хранение и не парится с разными типами и набором колонок. Но тогда для поиска по атрибутам нужно будет иметь какой-то отедльный сервер, например sphinx. Н
Ответ написан
Комментировать
@dizer
Используйте реляционность базы. Попробуйте не хранить в той же таблице сами данные, а только ссылки на них через полиморфную связь.

таблица entities
storable_id, storable_type

и таблицы entity_integers, entity_floats, etc.
id, value(в соответствующем типе)

ROR хорошо с такими вещами дружит.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы