динамически создавать разные аттрибуты комнатам (не меняя схему), например:
numberOfRooms: число
Или может быть
hasFridge: boolean
Или
view: [‘ocean’, ‘street’] (т.е. какой-то enum)
Как это лучше всего задизайнить?
таблицу с именами атрибутов (и например правилами валидации) и таблица значений со ссылкой на атрибут.
А как в таблице атрибутов указать, что атрибут булев например? Сделать енум типа “boolean|number|string” ?
Основные два варианта — EAV (отдельная таблица с полями имяатрибута, значение, ссылка на оснрвную таблицу) или поле типа json. В обоих вариантах есть проблемы.
Да, не оч понятно, как связывать комнаты и аттрибуты
а как по-колоночное хранение?
| id | field_name | value | | 1 | name | vasya | | 1 | age | 30 | | 2 | name | anton | | 2 | age | 39 |
Ну вот они у вас связаны, в чём вопрос-то?
А какого типа value?
string а тип отдельной колонкой. посмотрите как сделано в DB2 with BLU может и в опенсорсе это сделано, но я не видел
Понял, ну это фактически EAV
С EAV разобрался, а какие проблемы у JSON?
А про проблемы EAV тут никто и не начинал говорить, кстати.
Ну, первая проблема JSON — что это грубое попрание 1НФ. С соответствующими проблемами для реляцыонных вычислений.
Стало интересно, как вы решаете проблемы типов в EAV архитектуре на postgres ?
то что в тексте это понятно. Вы храните тип атрибута и потом к нему приводите?
Безусловно. Но вы надо думать хотели спросить — привожу ли на сервере? Тогда чаще нет, только по очень насущной необходимости.
Да примерно те же. Это уже обсуждалось, см. https://t.me/pgsql/345383 (и там выше).
Обсуждают сегодня