powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Пронетирование бд электроэнергетических устройств
106 сообщений из 106, показаны все 5 страниц
Пронетирование бд электроэнергетических устройств
    #39671413
eugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene
Хочу спроектировать базу электроэнергетических устройств
(имеется ввиду самый основной уровень, когда не рассматриваем элементы, детали устройств, коммуникационное оборудование, провод)
Сначала взял стандартную схему БД подобного типа

Но потом понял что нельзя делать одну табл Оборудование для ВСЕХ ТИПОВ устройств.
В самом деле, в физике и электроэнергетики есть разные классификации
каждого типа устройств, сам тип оборудования иногдв является не линейным а деревом.
Так для типа Электродвигатель основные подтипы -постоянного-переменного тока. Для переменного тока -следующий уровень-синхронный-асинхронный
Кроме того желательно отразить в БД не одну а несколько классификаций, причем разных для каждого типа устройства.
Например, электрогенераторы - по виду выходного электр тока -Постоянного, переменного
-по фазности выходного напряжения – на однофазные и трехфазные;
-по типу используемого топлива - дизельный, бензиновый и газовый
и т д т.е в отличие от приведенной выше схемы, под самой верхней сущностью ТИПОборудования
должно стоять не одна табл ОБОРУДОВАНИЕ а НЕСКОЛЬКО, т.е.
ЭЛЕКТРОДВИГАТЕЛИ , ЭЛЕКТРОГЕНЕРАТОРЫ, ИсточникиСВЕТА , ИсточникиВторичногоПитания (подтипы:хит (гальванич элем, батареи и акк), термобатареи, термоэлектр преобразователи, фотоэлектрич преобразователи...)
Возникает вопрос о проектировании такой структуры. т.е база -это фактическое соединение почти на верхнем уровне разнородных сущностей таблиц. Можно ли так делать? Не имел опыт. Что ,Все запросы SELECT придется писать в форме SELECT CASE?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671421
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eugene,

Нужно реализовать бизнес-наследование.

Например, в сущности ТипОборуд добавить поле КодРодительскогоТипа. Но лучше поддерживать множественное наследование, правда это будет дороже.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671423
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eugene,Все запросы SELECT придется писать в форме SELECT CASE?

Так как это EAV, запросы будут адскими, да. В таком случае всегда имеет смысл вести отдельно проекции, но это вообще не популярная практика.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671428
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поищите по ключевому слову EAV
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671451
eugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, расшифруйте термин EAV
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671457
eugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, Что имеете ввиду под термином бизнес-наследование?
У меня под рукой самая простая СУБД -MS Access. Дальше SQL Server и глядеть не хочу.
Если имеете ввиду объектно-ориентированные типа Jasmine - это мне не по карману

Я думаю что все-таки надо начать с древовидного классификатора Тип оборудования и запихнуть его в таблицу как запихивают в СУБД деревья. Правда у моей предметной области получается классификация не иерархическая а сетевая
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671468
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eugeneКроме того желательно отразить в БД не одну а несколько классификаций, причем разных для каждого типа устройства. Например, электрогенераторы - по виду выходного электр тока -Постоянного, переменного -по фазности выходного напряжения – на однофазные и трехфазные; -по типу используемого топлива - дизельный, бензиновый и газовый и т д
Это называется фасетная классификация. Имеет вполне проработанные хорошие решения.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671508
Serguei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eugeneВозникает вопрос о проектировании такой структуры. т.е база -это фактическое соединение почти на верхнем уровне разнородных сущностей таблиц. Можно ли так делать? Не имел опыт. Что ,Все запросы SELECT придется писать в форме SELECT CASE?
Начните с того, что опишите как собираетесь использовать эти данные. Какие задачи должны решаться?
Каталог оборудования только ради каталога лишен смысла.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671519
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eugene,

Подумайте над задачей, над тем, что в конечном счёте нужно. EAV гуглится, остальное пока рано.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671561
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eugeneТак для типа Электродвигатель основные подтипы -постоянного-переменного тока. Для переменного тока -следующий уровень-синхронный-асинхронный
Кроме того желательно отразить в БД не одну а несколько классификаций, причем разных для каждого типа устройства.
https://habr.com/post/254773/
читайте, практикуйтесь
пока до конца не поймёте хотя бы первые 3 формы, дальше не суйтесь
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671563
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671577
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78 4 альтернативы EAV

я бы не назвал их альтернативами ни при каком раскладе. EAV это динамическая модель атрибутов, которая всё же укладывается в реляционную структуру, а указанные inheritance это статическая, а LOB это вообще что угодно, без гарантий и контроля.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671602
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttip78 4 альтернативы EAV

я бы не назвал их альтернативами ни при каком раскладе. ...+500. Все 4 практически непригодны для реальных условий.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671633
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, поговоривают, что магенто перешло на flat tables (в списке толи 1, толи 3), сам правда не видел, не пользуюсь
альтернатива в том плане, что это всё ещё таблицы
я сам то предпочитаю всё что можно в редиске хранить
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671655
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78я сам то предпочитаю всё что можно в редиске хранить

сложные отчёты по редиске делали когда-нибудь? всёж инструмент надо выбирать не по принципу "предпочитаю", а исходя из задач и требований.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39671738
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttip78я сам то предпочитаю всё что можно в редиске хранить

сложные отчёты по редиске делали когда-нибудь? всёж инструмент надо выбирать не по принципу "предпочитаю", а исходя из задач и требований.
10 таблиц с фильтрами это сложные ?
такое проще агрегировать, по возможности (а она практически всегда есть)
редис он больше для внешнего мира нужен, а отчётность это скорее внутри, в CRM
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39672837
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
L_argohVosttпропущено...

я бы не назвал их альтернативами ни при каком раскладе. ...+500. Все 4 практически непригодны для реальных условий.

Что скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39672863
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорЧто скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/

Судя по статье, в решении с JSONB, нет схемы. В то время, как в реляционном исполнении она есть. Нельзя создать значение несуществующего Property. В JSONB можно, и набор значений свойст не контролируется со стороны БД.

Ничего против не имею, даже за в отдельных случаях, но так сравнивать нельзя. Это разное.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39672895
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорL_argoпропущено...
+500. Все 4 практически непригодны для реальных условий.

Что скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/ Где это работает (и не хуже) кроме как в ПостГре ?
Какова доля ПостГре на рынке СУБД ?

зы: ничеталъ
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673021
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорL_argoпропущено...
+500. Все 4 практически непригодны для реальных условий.

Что скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/

авторReplacing EAV with JSONB in PostgreSQL
дальше можно не читать.
JSONB никогда не заменит EAV, хотя бы потому, что там индексы много хуже работают. И сложный поиск там вообще труба.
И не GiN, ни jsonb_path_ops, ни jsquery тут не помогут. Производительность падает и запросы становятся сложнее.
Jsonb_path_ops хоть и быстрее монги, но он узконаправленный для очень простых случаев.
Вот что сами разрабы пишут:
авторНедостаток класса jsonb_path_ops заключается в том, что он не учитывает в индексе структуры JSON, не содержащие никаких значений {"a": {}}. Для поиска по документам, содержащих такие структуры, потребуется выполнить полное сканирование индекса, что довольно долго, поэтому jsonb_path_ops не очень подходит для приложений, часто выполняющих такие запросы.
Таблица, где ID + json CREATE TABLE bad_tbl(id serial,json json) = НЕправильная таблица.

В 11 придёт jsonB dictionary compression (jsonbc), вместе с SQL/JSON, но я всё-равно сомневаюсь, что он полностью заменит реляционную алгебру.

Ну а сейчас, если по данным производится поиск/выборки/JOIN-ы/итд, то это отдельные колонки. JSONB нужен, чтобы хранить простыню данных о юзере, которые второго плана и редко достаются.
Если туда редкие запросы, то GiN-индекс тащит, а если кол-во запросов растёт, то в отдельную колонку.

90 полезных слайдов про JSON
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673022
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* Таблица, где ID + json b CREATE TABLE bad_tbl(id serial,json json b ) = НЕправильная таблица.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673287
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорЧто скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/

Судя по статье, в решении с JSONB, нет схемы. В то время, как в реляционном исполнении она есть. Нельзя создать значение несуществующего Property. В JSONB можно, и набор значений свойст не контролируется со стороны БД.

Ничего против не имею, даже за в отдельных случаях, но так сравнивать нельзя. Это разное.

Ну может в этой статье ничего не сказано как ограничить администратора системы который собственно и решает надо добавлять новое поле или нет, но большой разницы с eav не вижу. Да, в случае с eav это ограничение на основе внешних ключей на уровне базы данных, а в случае с жейсон эту же логику ограничений можно сделать на уровне приложения. Скажем администратор системы решил быть таким и таким полям, а модератор хочет обойти это решение, хочет добавить дополнительное поле, это очень легко решается как и в случае с eav моделем.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673288
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
L_argoПомидорпропущено...


Что скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/ Где это работает (и не хуже) кроме как в ПостГре ?
Какова доля ПостГре на рынке СУБД ?

зы: ничеталъ

Тут важно (не обращая внимания на конкретную СУБД) действительно ли такое решение работает лучше или хуже. В случае с постгрес вроде добились хороших результатов, это в статье указано, значит пойдет тенденция и у других производителей субд.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673293
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tip78дальше можно не читать.
JSONB никогда не заменит EAV, хотя бы потому, что там индексы много хуже работают. И сложный поиск там вообще труба.
И не GiN, ни jsonb_path_ops, ни jsquery тут не помогут. Производительность падает и запросы становятся сложнее.
Jsonb_path_ops хоть и быстрее монги, но он узконаправленный для очень простых случаев.

Индексы там работают очень хорошо, это показано в статье. Чем же сложный поиск там труба? Можете на примере с eav моделю показать такой сложный запрос, сравним как эстетическую сторону вопроса так и производительную часть.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673299
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tip78* Таблица, где ID + json b CREATE TABLE bad_tbl(id serial,json json b ) = НЕправильная таблица.
В случае с постгерс ни не заставляет все поля кроме первичного ключа загонять в жейсон поле. Жейсон поле просто приятная возможность чтобы не плодить лишние сущности в базе, причем очень эффективная.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673336
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помидор, берите любой многоуровневый JSON и считайте скорость
lvl1 => [
lvl2 => [key21 => val21, key22 => [
lvl3 => [key31 => val31, key 32 => [
lvl4 => [key41 => val41]
]]]

вот наделайте таких миллион строк и тестируйте поиск val31, val41.
ну или https://postgrespro.ru/docs/postgrespro/10/datatype-json#JSON-INDEXING]почитайте внимательно доки
и послушайте Бартунова перед сном:
YouTube Video
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673341
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78Помидор, берите любой многоуровневый JSON

Ээ, а при чем тут "многоуровневый JSON"? Вы же вроде c EAV-моделью собрались сравнивать - какая это EAV-модель требует для отображения именно многоуровневый JSON для каждого entity?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673344
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин, а это что по-вашему?
Код: sql
1.
2.
3.
4.
5.
SELECT ...
FROM t1
JOIN t2 ON t1.id = t2.uid
LEFT JOIN t3 ON t3.id = t2.cid
LEFT JOIN t4 ON t4.id = t3.pid
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673346
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и далее, соот-но: WHERE t3.a = x AND t4.b = y
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673358
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78 Кот Матроскин, а это что по-вашему?А это сбор одной строки. Достать одну строку с BLOB (а это можеть быть хоть JSON хоть XML) в разы быстрее чем в EAV. И вероятность накосячить у EAV выше.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673363
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78Кот Матроскин, а это что по-вашему?

Какой-то незаконченный запрос непонятно чего :) может сойти в качестве примера "как не надо называть объекты в БД".

Я спросил структуру EAV (т.е., грубо говоря, какие сущности с какими атрибутами Вы планируете в ней хранить).
И почему-то мне кажется, что в JSON-ах, хранящих эти атрибуты для каждой сущности, вполне можно будет обойтись одним уровнем.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673366
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорНу может в этой статье ничего не сказано как ограничить администратора системы который собственно и решает надо добавлять новое поле или нет, но большой разницы с eav не вижу. Да, в случае с eav это ограничение на основе внешних ключей на уровне базы данных, а в случае с жейсон эту же логику ограничений можно сделать на уровне приложения.

Тогда postgres здесь как бы не упёрся, берём монгу или другое документо-ориентированное хранилище и привет. Суть именно EAV в сохранении ограничений целостности БД, хоть в какой-то мере.


ПомидорСкажем администратор системы решил быть таким и таким полям, а модератор хочет обойти это решение, хочет добавить дополнительное поле, это очень легко решается как и в случае с eav моделем.

Это бардак.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673368
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорВ случае с постгерс ни не заставляет все поля кроме первичного ключа загонять в жейсон поле. Жейсон поле просто приятная возможность чтобы не плодить лишние сущности в базе, причем очень эффективная.

Эффективная, но это не альтернатива EAV, в полной мере так сказать. Это другое. Например, со стороны приложения запихать каких-то полей, чудоковатых, при чём у каждой записи вообще свой набор полей. Или сохранить объектную структуру документа, да много чего. Но это не EAV.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673370
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt Но это не EAV.
Какая задача, легко решаемая EAV, не может быть решена при помощи подхода с JSON/XML?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673372
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt Суть именно EAV в сохранении ограничений целостности БД, хоть в какой-то мереЭто какие такие ограничения накладывает EAV?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673374
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинhVostt Но это не EAV.
Какая задача, легко решаемая EAV, не может быть решена при помощи подхода с JSON/XML?

Ну давайте посмотрим. Независимость от конкретных РСУБД. Ограничения целостности (не может быть значений отсутствующих атрибутов). Расширенный EAV мог бы вести типовые значения в отдельных таблицах или колонках, т.е. спектр типов, поддерживаемый БД шире JSON, даже в понятиях ANSI. Ну XML слишком жирный, хотя поддерживаемых примитивных типов больше.

И "решена", имеется в виду средствами БД. Так как если сводить на уровень приложения, вообще всё можно решить, даже без БД ))
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673375
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257hVosttСуть именно EAV в сохранении ограничений целостности БД, хоть в какой-то мереЭто какие такие ограничения накладывает EAV?

Нельзя создать значение для отсутствующего атрибута. Можно запретить удаление атрибута при наличии значений. Если создавать типовые колонки или таблицы значений, можно задать соответственно типовые ограничения, в том числе ссылки.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673377
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскинtip78Кот Матроскин, а это что по-вашему?

Какой-то незаконченный запрос непонятно чего :) может сойти в качестве примера "как не надо называть объекты в БД".

Я спросил структуру EAV (т.е., грубо говоря, какие сущности с какими атрибутами Вы планируете в ней хранить).


как это "непонятно чего"? Обычная отчётность захватывает кучу таблиц и требует их фильтрации.
Поиск свойств товаров.
Любые случаи, которые не решаются простым "overlaps".

авторИ почему-то мне кажется, что в JSON-ах, хранящих эти атрибуты для каждой сущности, вполне можно будет обойтись одним уровнем.
я не пойму, вы никогда не видели многоуровневые JSON-ы?
Берёте любой и ищите значение из последней группы, а потом сравниваете с поиском в отдельных колонках.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673378
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257tip78 Кот Матроскин, а это что по-вашему?А это сбор одной строки. Достать одну строку с BLOB (а это можеть быть хоть JSON хоть XML) в разы быстрее чем в EAV. И вероятность накосячить у EAV выше.
не достать. НАЙТИ! В последней ветке.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673380
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКот Матроскинпропущено...

Какая задача, легко решаемая EAV, не может быть решена при помощи подхода с JSON/XML?

Ну давайте посмотрим. Независимость от конкретных РСУБД.

Вполне достигается :) Вряд ли найдется СУБД, которая не сможет хранить XML/JSON. Возможно, не получится эффективно искать в них - ну так опаньки, "независимость от конкретных СУБД" вообще плохо сочетается с максимальной эффективностью, тут снявши голову по волосам не плачут.

hVostt Ограничения целостности (не может быть значений отсутствующих атрибутов).

У XML и JSON внезапно есть схемы :) Возможности которых гораздо шире, чем "не может быть значений отсутствующих атрибутов". Так что тут минус у EAV.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673382
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78Кот Матроскинпропущено...

Какой-то незаконченный запрос непонятно чего :) может сойти в качестве примера "как не надо называть объекты в БД".

Я спросил структуру EAV (т.е., грубо говоря, какие сущности с какими атрибутами Вы планируете в ней хранить).


как это "непонятно чего"? Обычная отчётность захватывает кучу таблиц и требует их фильтрации.

Я еще раз напоминаю, что Вы собрались сравнивать EAV . Так что давайте будем смотреть запрос сущностей, лежащих в EAV, и по атрибутам, тоже лежащим в EAV.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673385
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинВполне достигается :) Вряд ли найдется СУБД, которая не сможет хранить XML/JSON. Возможно, не получится эффективно искать в них - ну так опаньки, "независимость от конкретных СУБД" вообще плохо сочетается с максимальной эффективностью, тут снявши голову по волосам не плачут.

Вот не надо. Классический EAV, будет примерно одинаковый на широком спектре СУБД и примерно одинаково будет работать по скорости.

Инструменты для работы с XML/JSON в разных СУБД, если они есть, то работа с ними отличается полностью. А хранить типа в string, ну это извините, уже за рамками дискуссии. Можно всю БД таким образом хранить в одном поле одной записи в XML.


Кот МатроскинУ XML и JSON внезапно есть схемы :)

Динамические схемы? Которые проверяются со стороны БД? Нет? Тогда не очень тут говорить :)

Кот МатроскинВозможности которых гораздо шире, чем "не может быть значений отсутствующих атрибутов". Так что тут минус у EAV.

Это поддерживается СУБД? В динамике? Нет? Ну а чего тогда.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673389
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Кот МатроскинУ XML и JSON внезапно есть схемы :)

Динамические схемы?

Что имеется в виду под "динамическими схемами"?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673393
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинЧто имеется в виду под "динамическими схемами"?

Значит новые атрибуты добавляются/изменяются как данные.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673397
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКот МатроскинЧто имеется в виду под "динамическими схемами"?

Значит новые атрибуты добавляются/изменяются как данные.
Они добавляются и изменяются, но не "как данные" (и это, опять же, плюс, а не минус). Путать в один винегрет данные и метаданные - это родимое пятно EAV, странно это считать достоинством.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673404
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинhVosttпропущено...


Значит новые атрибуты добавляются/изменяются как данные.
Они добавляются и изменяются, но не "как данные" (и это, опять же, плюс, а не минус). Путать в один винегрет данные и метаданные - это родимое пятно EAV, странно это считать достоинством.

В этом весь смысл EAV, а не достоинство. Иначе нафига мне эти JSON с XML-ем упёрлись, если я просто могу создавать таблицы и налаживать между ними связи? Как обычно.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673411
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскинtip78пропущено...


как это "непонятно чего"? Обычная отчётность захватывает кучу таблиц и требует их фильтрации.

Я еще раз напоминаю, что Вы собрались сравнивать EAV . Так что давайте будем смотреть запрос сущностей, лежащих в EAV, и по атрибутам, тоже лежащим в EAV.
ну так разложите дерево JSON по таблицам и сравнивайте. Я про это говорю уже 3й пост.
Или откройте видео на 25:00 и послушайте минуту самих разработчиков.
Кстати, hVostt напомнил ещё один важный момент - даже цифры там являются текстом. Т.е. скорость поиска падает уже даже на этом простом факте.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673413
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, на 29й минуте он рассказывает про jsonpath, а на 31й про ф-ю JSON_TABLE()
оба нововведения выйдут в 11й версии
'jsonpath' -- позволяет указывать путь поиска внутри дерева. Крутой бафф индексов.
JSON_TABLE() -- позволяет представить JSON-tree в виде таблицы. Делать с ней JOIN и т.д.

Т.е. мы получим EAV через JSON. На-ко-нец-то.
Вопрос - "а нах*й оно нам надо?", это отдельный вопрос.
Искать по глубокому дереву всё ещё будет медленнее, чем в обычном EAV. Разве что только по верхней ветке будет более-менее быстро.
Но с отдельными колонками думаю всё-равно не сравнить.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673420
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78,

На самом деле JSONB действительно лучше, чем EAV, если не принимать во внимание такие недостатки как:

крайне сильная зависимость от конкретной СУБД и даже от конкретной её версии, это значит, что для другой СУБД придётся переписать всё, в то время как EAV останется рабочим на стандартном диалекте SQL

очень слабый контроль целостности со стороны БД

Хранение структур данных в таблицах с возможностью поиска, индексации, и построения запросов это маст хев однозначно. Полноценное документное хранилище в реляционке, конец войнам и спорам.

Но это не EAV, не является её альтернативой, и не решает задач так, как их решает EAV.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673421
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78Искать по глубокому дереву всё ещё будет медленнее,
В третий раз - чтобы эмулировать EAV, никакие "глубокие деревья" в JSON не нужны.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673422
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё один недостаток

типы, не надо рассказывать про десериализацию дат, десятичных числовых полей и прочее
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673423
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскинtip78Искать по глубокому дереву всё ещё будет медленнее,
В третий раз - чтобы эмулировать EAV, никакие "глубокие деревья" в JSON не нужны.

Нельзя эмулировать EAV, JSON-ом.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673426
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВ этом весь смысл EAV, а не достоинство. Иначе нафига мне эти JSON с XML-ем упёрлись, если я просто могу создавать таблицы и налаживать между ними связи? Как обычно.

Если считать "смыслом EAV" создание винегрета из данных и метаданных - то вполне возможно в этом ей нет конкуренции :) Но я как-то считал ее предназначением динамическую настройку атрибутов сущности. И эту задачу JSON/XML вполне решают, с лучшим нежели EAV контролем целостности.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673431
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинhVosttВ этом весь смысл EAV, а не достоинство. Иначе нафига мне эти JSON с XML-ем упёрлись, если я просто могу создавать таблицы и налаживать между ними связи? Как обычно.

Если считать "смыслом EAV" создание винегрета из данных и метаданных - то вполне возможно в этом ей нет конкуренции :) Но я как-то считал ее предназначением динамическую настройку атрибутов сущности. И эту задачу JSON/XML вполне решают, с лучшим нежели EAV контролем целостности.

Нет не решают. JSON хранит какие угодно данные, максимум что может обеспечить СУБД, это валидность JSON-а, но не содержание. В EAV мы ведём и схему и данные, и это контролируется БД. Если вести некий гибрид, типа EA-JSON (где V это JSON), то БД не будет гарантировать, что в JSON там не хранится какой-то полный бред, ну никак. А также не может запретить удалить атрибут при наличии значений. А также невозможно полноценное ведение значений -- ссылок.

Это не + или -, это просто факты. Поэтому JSON это не EAV, это совершенно разные решения, которые не решают одно и ту же задачу, они решают разные задачи.

Вы почему-то настойчиво пытаетесь проявить своё негативное отношение к модели данных, и поэтому делаете не верные выводы.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673437
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttJSON хранит какие угодно данные, максимум что может обеспечить СУБД, это валидность JSON-а, но не содержание. В EAV мы ведём и схему и данные, и это контролируется БД. Если вести некий гибрид, типа EA-JSON (где V это JSON), то БД не будет гарантировать, что в JSON там не хранится какой-то полный бред, ну никак. А также не может запретить удалить атрибут при наличии значений. А также невозможно полноценное ведение значений -- ссылок.

Это не + или -, это просто факты.
Не знаю как JSON, но содержимое XML-ей, их соответствие схеме и т.п. СУБД вполне умеет контролировать. Это просто факты :)
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673440
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинНе знаю как JSON, но содержимое XML-ей, их соответствие схеме и т.п. СУБД вполне умеет контролировать. Это просто факты :)

Представим UI админки интернет-магазина. Заходит админ, открывает раздел "атрибуты товара", добавляет новый атрибут, допустим, «Цвет», указывает тип, сохраняет. В БД улетает обычный INSERT, который добавляет в схему новое поле. И он с этого момента начинает контролироваться БД. Можно и список всех атрибутов получить как обычный запрос, и каких-то левых Value засунуть не получится, только в рамках заданных атрибутов.

Расскажите, как у вас это будет организовано на XML.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673463
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНа самом деле JSONB действительно лучше, чем EAV
hVosttНо это не EAV, не является её альтернативой, и не решает задач так, как их решает EAV.
и как это вам удалось собрать 2 этих утверждения в одном сообщении? )
Тут либо оно лучше и заменяет, либо оно само по себе и лучше "самого себя", а EAV это таки другое.
Взаимоисключающие_параграфы

на самом деле, после выхода jsquery, json_path_ops и селективных индексов (когда индекс не на всё дерево, а только на нужные ключи, что делает его в разы меньше и быстрее) - можно перетестировать различные паттерны.
Но не такие примитивные, как в статье, где поиск только по верхнему ключу, а что-то посерьёзней, типа сложной отчётности, категорий, свойств итд.
Я вот когда пробовал заменить свои задачи на JSONB в итоге плюнул.

GIN jsonb_path_ops порвал монгу и все остальные индексы.
(в статье его даже не юзали, как и jsquery)
Ещё они планируют таки добавить (толи тип, толи функцию) datetime(), которая сможет управлять таймстампами в JSONB... Т.е. одним недостатком меньше.

Но мой тезис был не о том, что JSONB ни на что не годится. Речь то не про то.
Он рулит в своей нише, но эта ниша не может полностью заменить EAV, просто потому, что нет полноценной замены плюшек EAV. Нет релятивисткого "сахара". FK нет.
И потом, когда достаёшь это счастье в ПХП, тебе на каждой строчке надо делать json_decode(), что при 100 строках уже чувствуется.

Когда надо сложить в кучу много второстепенной инфы, то да, там можно всё скинуть в jsonb, но если там надо будет искать глубоко по дереву, то до появления jsquery это было очень проблематично и затратно.
Но даже сейчас, если фильтр будет сложным, результат может не понравиться.
В 11й может будет лучше. А может нет.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673511
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78и как это вам удалось собрать 2 этих утверждения в одном сообщении? )

Согласен, глупо получилось. Я хотел сказать, если вам надо хранить произвольные структуры данных, то JSON(B) лучше EAV.

Т.е. это лучше вот этого

Код: sql
1.
2.
create table entities (id, name);
create table entity_values(id, entity_id, attribute_name, attribute_value);




tip78Я вот когда пробовал заменить свои задачи на JSONB в итоге плюнул.

Ну вот и вы туда же Заменить задачи?

В общем, мне к сказанному больше нечего добавить, всё довольно очевидно и понятно.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673525
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В БД улетает обычный INSERT, который добавляет в схему новое поле .Опечатка ? Новую запись ?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673530
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКот МатроскинНе знаю как JSON, но содержимое XML-ей, их соответствие схеме и т.п. СУБД вполне умеет контролировать. Это просто факты :)

Представим UI админки интернет-магазина. Заходит админ, открывает раздел "атрибуты товара", добавляет новый атрибут, допустим, «Цвет», указывает тип, сохраняет. В БД улетает обычный INSERT, который добавляет в схему новое поле. И он с этого момента начинает контролироваться БД. Можно и список всех атрибутов получить как обычный запрос, и каких-то левых Value засунуть не получится, только в рамках заданных атрибутов.

Расскажите, как у вас это будет организовано на XML.
google "SQL Server xml schema collection".
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673565
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoВ БД улетает обычный INSERT, который добавляет в схему новое поле .Опечатка ? Новую запись ?

Новый атрибут, поле с точки зрения динамической модели данных.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673566
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскинgoogle "SQL Server xml schema collection".

Код добавление атрибута в студию. И удаления с зависимыми значениями.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39673644
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЯ хотел сказать, если вам надо хранить произвольные структуры данных, то JSON(B) лучше EAV.

Т.е. это лучше вот этого

Код: sql
1.
2.
create table entities (id, name);
create table entity_values(id, entity_id, attribute_name, attribute_value);


а если надо отсортировать по attribute_name ?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674110
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорНу может в этой статье ничего не сказано как ограничить администратора системы который собственно и решает надо добавлять новое поле или нет, но большой разницы с eav не вижу. Да, в случае с eav это ограничение на основе внешних ключей на уровне базы данных, а в случае с жейсон эту же логику ограничений можно сделать на уровне приложения.

Тогда postgres здесь как бы не упёрся, берём монгу или другое документо-ориентированное хранилище и привет. Суть именно EAV в сохранении ограничений целостности БД, хоть в какой-то мере.


ПомидорСкажем администратор системы решил быть таким и таким полям, а модератор хочет обойти это решение, хочет добавить дополнительное поле, это очень легко решается как и в случае с eav моделем.

Это бардак.

Зачем монго когда эту задачу эффективно решает postgres? Я привел jsonb только для моделей которые требуют динамические аттрибуты (аналог eav), все остальное решается как обычно в рсубд.
Что значит бардак? Разве не администратор интернет магазина решает что для конкретной категории товаров нужны определенные аттрибуты с указанием типа аттрибута, ограничением определенных значений которые она может принимать и так далее? Тоже самое можно сделать и для жейсона, но как я уже написал валидация данных в вашем случае будет ну уровне базы данных, а в моем случае на уровне приложения. Здесь почти разницы нету, обе могут решить задачи валидации данных. А вот когда надо будет запросы с фильтрацией, то жейсон уже вырывается вперед, а eav остается далеко позади, что и сказано в указанной мной статье.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674111
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttКот Матроскинпропущено...

Какая задача, легко решаемая EAV, не может быть решена при помощи подхода с JSON/XML?

Ну давайте посмотрим. Независимость от конкретных РСУБД. Ограничения целостности (не может быть значений отсутствующих атрибутов). Расширенный EAV мог бы вести типовые значения в отдельных таблицах или колонках, т.е. спектр типов, поддерживаемый БД шире JSON, даже в понятиях ANSI. Ну XML слишком жирный, хотя поддерживаемых примитивных типов больше.

И "решена", имеется в виду средствами БД. Так как если сводить на уровень приложения, вообще всё можно решить, даже без БД ))

Про какую независимость РСУБД вы имеете ввиду? Если хорошая фича реализована в одной системе, то скоро она станет стандартам.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674113
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tip78Кот Матроскин, а это что по-вашему?
Код: sql
1.
2.
3.
4.
5.
SELECT ...
FROM t1
JOIN t2 ON t1.id = t2.uid
LEFT JOIN t3 ON t3.id = t2.cid
LEFT JOIN t4 ON t4.id = t3.pid


Ваш запрос не очень понятен. Можете более развернуто написать задачу, его решение на примере eav, а я попробую написать запрос который также решит эту задачу применив жейсон модель.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674114
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорВ случае с постгерс ни не заставляет все поля кроме первичного ключа загонять в жейсон поле. Жейсон поле просто приятная возможность чтобы не плодить лишние сущности в базе, причем очень эффективная.

Эффективная, но это не альтернатива EAV, в полной мере так сказать. Это другое. Например, со стороны приложения запихать каких-то полей, чудоковатых, при чём у каждой записи вообще свой набор полей. Или сохранить объектную структуру документа, да много чего. Но это не EAV.
Чем же это не EAV? Что вы понимаете под EAV? Хорошо, давайте сперва определимся какую задачу решает EAV модель, как она контролирует целостность данных, проводит валидацию, как добавляются новый записи (новый аттрибут товара). И я приведу на жейсоне решение которая будет тоже самое делать.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674115
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttSERG1257пропущено...
Это какие такие ограничения накладывает EAV?

Нельзя создать значение для отсутствующего атрибута. Можно запретить удаление атрибута при наличии значений. Если создавать типовые колонки или таблицы значений, можно задать соответственно типовые ограничения, в том числе ссылки.
Все это также решается на жейсоне. Если приведете пример котороя не решается на жейсоне, но вот так просто решается на eav модели, то буду рад исследовать эту задачу.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674131
DataMigrator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eugene,

Можно через связующие таблицы.

авторКроме того желательно отразить в БД не одну а несколько классификаций, причем разных для каждого типа устройства.
Можно будет к одной единице оборудования привязывать множество классификаций-типизаций ,каждая из которых в свою очередь связана со множеством классов и типов соответственно.

Например как-то так.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674132
DataMigrator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никакого EAV,XML,JSON не понадобится.
Все индексирется и селектится дешево и сердито.
Можно наложить всяких ограницений по уникальности комбинаций ключей.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674139
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорЗачем монго когда эту задачу эффективно решает postgres? Я привел jsonb только для моделей которые требуют динамические аттрибуты (аналог eav), все остальное решается как обычно в рсубд.

Нет, не аналог EAV. Динамические атрибуты без схемы, это вообще любое хранилище, без схемы, хоть текстовые файлы. Таким макаром и обычный блокнот можно назвать аналогом чего угодно.

ПомидорЧто значит бардак? Разве не администратор интернет магазина решает что для конкретной категории товаров нужны определенные аттрибуты с указанием типа аттрибута, ограничением определенных значений которые она может принимать и так далее? Тоже самое можно сделать и для жейсона, но как я уже написал валидация данных в вашем случае будет ну уровне базы данных, а в моем случае на уровне приложения.

Речь идёт именно о СУБД. На уровне приложения я могу данные вообще хранить в key-value store и всё-всё-всё проверять на уровне приложения, или даже в текстовых файлах хранить. Аналог? Что за детский сад?

ПомидорЗдесь почти разницы нету

Ну так и все ограничения целостности, транзакции, и всё остальное делайте на уровне приложения. Зачем говорить вообще тогда о БД. Храните хоть всё в памяти, и сбрасывайте дамп на диск. Разницы ведь почти нет.

ПомидорА вот когда надо будет запросы с фильтрацией, то жейсон уже вырывается вперед, а eav остается далеко позади, что и сказано в указанной мной статье.

В указанной вами статье, SELECT по EAV с индексом быстрее, чем все вариации с JSONb. Обновление с индексом чуть-чуть медленнее. По собственному опыту, у нас есть внедрённая система на EAV, довольно крупная по мерками enterprise, и всё работает шустро.

Что касается лучшей реализации, то делать проекции на классических таблицах, добавляя колонки динамически в таблицы, не оставляет вообще никаких шансов по скорости ни EAV, ни JSONb, если уж вас так интересует производительность.

И, повторюсь, JSONB не явяется аналогом EAV.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674140
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорПро какую независимость РСУБД вы имеете ввиду? Если хорошая фича реализована в одной системе, то скоро она станет стандартам.

ANSI SQL. Это будет работать сейчас в абсолютном большинстве СУБД. «Скоро» по-вашему, это когда? Когда для работы с JSON в пятёрке самых крупных БД будет одинаковый синтаксис запросов и набор операций? Лет через 10?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674141
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорЧем же это не EAV? Что вы понимаете под EAV? Хорошо, давайте сперва определимся какую задачу решает EAV модель, как она контролирует целостность данных, проводит валидацию, как добавляются новый записи (новый аттрибут товара). И я приведу на жейсоне решение которая будет тоже самое делать.

Я уже давно жду вот такой пример:

1. Администратор интернет-магазина через UI приложения добавляет атрибут для товаров.
2. Администратор добавляет значения этого атрибута для некоторых товаров.
3. Администратор удаляет атрибут, значения атрибута удаляются.

Для JSON(B)
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674149
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЧто касается лучшей реализации, то делать проекции на классических таблицах, добавляя колонки динамически в таблицы, не оставляет вообще никаких шансов по скорости ни EAV, ни JSONb, если уж вас так интересует производительность.
разделить данные на постоянную часть (условно, таблица CLIENTS, на которую завязана бизнес-логика) и динамическую (условно, таблица CLIENTS_ADDITIONAL_FIELDS, на которую ничего не завязано) ?
и подкладывать из отдельной таблицы какой-нибудь JSON/XML с доп.полями?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674151
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читал эту тему , никуда там так и не пришли...
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674154
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78разделить данные на постоянную часть (условно, таблица CLIENTS, на которую завязана бизнес-логика) и динамическую (условно, таблица CLIENTS_ADDITIONAL_FIELDS, на которую ничего не завязано) ?
и подкладывать из отдельной таблицы какой-нибудь JSON/XML с доп.полями?

Ну лично я имею в виду A+ES, все изменения данных через события, в РСУБД генерируются таблицы из событий. Но можно и ещё 50 разных способов и подходов расмотреть.

Я бы не делил динамическую и статическую часть. Так как с развитием они начнут перемешиваться. То, что раньше казалось не важным и легко в динамику, легко может стать существенно важным, а переносить в статику, это довольно серьёзное изменение. И следить за двумя кусками одни и тех же данных (бизнес не различает «статику» и «динамику») -- усложнять жизнь в дальнейшем. Но это ИМХО.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674155
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78читал эту тему , никуда там так и не пришли...

Хз насчёт темы, у нас в текущей систему динамически создаётся и ведётся системой 100% таблиц в РСУБД. И все счастливы.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674160
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttip78читал эту тему , никуда там так и не пришли...

Хз насчёт темы, у нас в текущей систему динамически создаётся и ведётся системой 100% таблиц в РСУБД. И все счастливы.
а пример можете показать? или ссылку
мы сейчас говорим про саму архитектуру данных, или что за "динамические колонки" ?
так то джойнами мы тоже получаем 100% динамические таблицы...
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674162
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78а пример можете показать? или ссылку
мы сейчас говорим про саму архитектуру данных, или что за "динамические колонки" ?
так то джойнами мы тоже получаем 100% динамические таблицы...

Вы попробуйте на EAV построить более-менее сложный копоративный отчёт, где присутствует не только фильтрация, но и группировки, подзапросы, drilldown, и т.д. К слову, на JSONB ситуация будет ещё печальнее, придётся городить кучу вьюх и поддерживать их, и это будет прибито намертво ржавыми гвоздями к конкретной СУБД и конкретной её версии.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674167
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttip78а пример можете показать? или ссылку
мы сейчас говорим про саму архитектуру данных, или что за "динамические колонки" ?
так то джойнами мы тоже получаем 100% динамические таблицы...

Вы попробуйте на EAV построить более-менее сложный копоративный отчёт, где присутствует не только фильтрация, но и группировки, подзапросы, drilldown, и т.д. К слову, на JSONB ситуация будет ещё печальнее, придётся городить кучу вьюх и поддерживать их, и это будет прибито намертво ржавыми гвоздями к конкретной СУБД и конкретной её версии.
да есть у меня это всё
в большинстве случае решается агрегацией в отдельной таблице
в JSONB я бы никогда не стал этого делать
вы про эту динамику чтоли?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674168
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78да есть у меня это всё
в большинстве случае решается агрегацией в отдельной таблице
в JSONB я бы никогда не стал этого делать
вы про эту динамику чтоли?

Наверное :)
Если вы спрашиваете про архитектуру, мы раньше решали это классическим EAV, пробовали JSON и JSONB. И XML тоже пробовали. А потом пересели на CQRS+ES, и все эти костыли ушли в прошлое :)
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674182
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорЗачем монго когда эту задачу эффективно решает postgres? Я привел jsonb только для моделей которые требуют динамические аттрибуты (аналог eav), все остальное решается как обычно в рсубд.

Нет, не аналог EAV. Динамические атрибуты без схемы, это вообще любое хранилище, без схемы, хоть текстовые файлы. Таким макаром и обычный блокнот можно назвать аналогом чего угодно.

Совершенно верно, все это аналоги, но все эти хранилища будут различаться по удобству, скорости, и т.д. Здесь я придерживаюсь варианта хранения динамических данных в жейсон поле. Вы пишете про схемы, давайте решать определенную задачу. В жейсоне я могу создать дополнительное поле 'validation_rules', в таблице справочнике Аттирибуты, и при добавление добавление, обновление этого поля, могу сделать валидацию. Как в EAV вы решаете эту задачу?

hVosttПомидорЧто значит бардак? Разве не администратор интернет магазина решает что для конкретной категории товаров нужны определенные аттрибуты с указанием типа аттрибута, ограничением определенных значений которые она может принимать и так далее? Тоже самое можно сделать и для жейсона, но как я уже написал валидация данных в вашем случае будет ну уровне базы данных, а в моем случае на уровне приложения.

Речь идёт именно о РСУБД. На уровне приложения я могу данные вообще хранить в key-value store и всё-всё-всё проверять на уровне приложения, или даже в текстовых файлах хранить. Аналог? Что за детский сад?
Я РСУБД использую как хранилище. Конечно обязательно пользуюсь возможностями целостности, правильности управления данными которые предоставляет РСУБД, но никто не отменял более сложные бизнес правила, которые притом еще динамические. И это не секрет никому, делаются на уровне сервера приложений. Что тогда меняет еще дополнительно проверять валидность данных на уровне приложения? Для очень загруженных систем как раз и применяют key-value store совместно с рсубд.

hVosttПомидорЗдесь почти разницы нету

Ну так и все ограничения целостности, транзакции, и всё остальное делайте на уровне приложения. Зачем говорить вообще тогда о БД. Храните хоть всё в памяти, и сбрасывайте дамп на диск. Разницы ведь почти нет.
Вы кажется специально вводите, запутываете, собираете все в кучу. Транзакции как раз делаются на уровне БД. А вот читать данные можно и с памяти, чем и занимается редис например.
hVosttПомидорА вот когда надо будет запросы с фильтрацией, то жейсон уже вырывается вперед, а eav остается далеко позади, что и сказано в указанной мной статье.

В указанной вами статье, SELECT по EAV с индексом быстрее, чем все вариации с JSONb. Обновление с индексом чуть-чуть медленнее. По собственному опыту, у нас есть внедрённая система на EAV, довольно крупная по мерками enterprise, и всё работает шустро.

Что касается лучшей реализации, то делать проекции на классических таблицах, добавляя колонки динамически в таблицы, не оставляет вообще никаких шансов по скорости ни EAV, ни JSONb, если уж вас так интересует производительность.

И, повторюсь, JSONB не явяется аналогом EAV.
В указанной мной статье нигде не указанно что бы утверждаете. Жейсон везде выигрывает.
авторHere we can see that JSONB was again faster without indexes for EAV, but when the index is used EAV is the fastest. But then I noticed the times for the JSONB queries were the same, pointing me to the fact that the GIN index is not used. Apparently, when you use a GIN index on the full properties column, it only has effect when using the containment (@>) operator. I added this to the benchmark and it had a huge effect on the timing: only 0.153ms! That’s 15000x faster then EAV, and 25000x faster than the ->> operator.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674197
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорЧем же это не EAV? Что вы понимаете под EAV? Хорошо, давайте сперва определимся какую задачу решает EAV модель, как она контролирует целостность данных, проводит валидацию, как добавляются новый записи (новый аттрибут товара). И я приведу на жейсоне решение которая будет тоже самое делать.

Я уже давно жду вот такой пример:

1. Администратор интернет-магазина через UI приложения добавляет атрибут для товаров.
2. Администратор добавляет значения этого атрибута для некоторых товаров.
3. Администратор удаляет атрибут, значения атрибута удаляются.

Для JSON(B)
Таблица Аттрибутивы:
id,
name,
title,
validation_rules jsonb,
....

Таблица Товары:
id,
name,
category_id,
parameters jsonb,
....

Таблица Категория товаров:
id,
parent_id,
name,
....

Таблица КатегорияТоваровАттрибуты
id,
category_id,
attribute_id,
...

Задача 1 и 2. Хотим добавить новый динамический аттрибут для определенной катеригории товаров.
1. Добавляем новое значение в таблицу Аттрибуты, заносим правила валидации для значений этого аттрибута
2. Добавляем новое значение в таблицу КатегорияТоваровАттрибуты, указываем нужную категорию, и аттрибут из шага 1.
3. Открываем нужный товар данной категории, приложение автоматически показывает что нужно заполнить новое поле (зависит от правила валидации, нужно к обязательному заполнению или нет). Проводит валидацию введенного значения (правила берет из таблицы Аттрибуты выбранного поля).
4. На стороне сервера приложений также проводится валидация данных, если все ок, то поле parameters обновляется.

Задача 3. Удаляем запись из КатегорияТоваровАттрибуты, допольнительно удаляем запись из поля parameters в таблице Товары. Все это делается через транзакцию.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674205
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostttip78да есть у меня это всё
в большинстве случае решается агрегацией в отдельной таблице
в JSONB я бы никогда не стал этого делать
вы про эту динамику чтоли?

Наверное :)
Если вы спрашиваете про архитектуру, мы раньше решали это классическим EAV, пробовали JSON и JSONB. И XML тоже пробовали. А потом пересели на CQRS+ES, и все эти костыли ушли в прошлое :)
если я правильно понял, CQRS + ES чем-то напоминает blockchain
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674214
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну точно оно
авторВот именно вопрос «производительности» мне и интересен. Потому что на простых примерах (когда за IO можно уследить глазками) всё всегда хорошо. Плохо начинается, когда запросы летят десятками тысяч в секунду. Обычная БД скрипит, но терпит. А если мы ведём журнал + head состояния? Пока всё хорошо, всё хорошо. А потом нам надо rebuild и мы стоим перед задачей перемолотить пол-года того, что в нормальном режиме грузило систему на 50%…
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674289
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорСовершенно верно, все это аналоги, но все эти хранилища будут различаться по удобству, скорости, и т.д. Здесь я придерживаюсь варианта хранения динамических данных в жейсон поле. Вы пишете про схемы, давайте решать определенную задачу. В жейсоне я могу создать дополнительное поле 'validation_rules', в таблице справочнике Аттирибуты, и при добавление добавление, обновление этого поля, могу сделать валидацию. Как в EAV вы решаете эту задачу?

В атрибут добавится поле validation_rules. Вы лучше расскажите, как вы сделаете поле FK в json.

ПомидорЯ РСУБД использую как хранилище. Конечно обязательно пользуюсь возможностями целостности, правильности управления данными которые предоставляет РСУБД, но никто не отменял более сложные бизнес правила, которые притом еще динамические. И это не секрет никому, делаются на уровне сервера приложений. Что тогда меняет еще дополнительно проверять валидность данных на уровне приложения? Для очень загруженных систем как раз и применяют key-value store совместно с рсубд.

Да при чём тут более сложные бизнес правила? Мы говорим про сравнение JSON и EAV, а не про весь спект всех задач, решаемых в мире. И я говорю, это не аналоги. А вы начинаете про какую-то сложную бизнес-логигу блаблабла. При чём тут это вообще? При чём тут ваши способы решения валидации? Если они не в БД?


ПомидорВы кажется специально вводите, запутываете, собираете все в кучу. Транзакции как раз делаются на уровне БД. А вот читать данные можно и с памяти, чем и занимается редис например.

Это вы всё в кучу собираете. Я как раз пытаюсь стряхнуть пыль. То, что вы можете сохранить в поле JSON что угодно, не делает его аналогом EAV, что тут непонятного?

ПомидорВ указанной мной статье нигде не указанно что бы утверждаете. Жейсон везде выигрывает.

Со всеми приседаниями, которые требуется сделать, чтобы JSON выигрывал у EAV, оно не нужно и задаром.

И уж если вернуться к тебе разговора, что JSON это не аналог EAV, я уже озвучил почему, такие сравнения выглядят довольно смешными.

Хотите хранить в БД какой-то структурированный мусор с точки зрения БД, и управлять этим со стороны приложения, пожалуйста, используйте JSONB, можно даже в обычное текстовое поле запихивать JSON и это будет работать вообще на всех БД. Но это не EAV.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674290
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорТаблица Аттрибутивы:
id,
name,
title,
validation_rules jsonb,
....

Таблица Товары:
id,
name,
category_id,
parameters jsonb,
....

Таблица Категория товаров:
id,
parent_id,
name,
....

Таблица КатегорияТоваровАттрибуты
id,
category_id,
attribute_id,
...

Задача 1 и 2. Хотим добавить новый динамический аттрибут для определенной катеригории товаров.
1. Добавляем новое значение в таблицу Аттрибуты, заносим правила валидации для значений этого аттрибута
2. Добавляем новое значение в таблицу КатегорияТоваровАттрибуты, указываем нужную категорию, и аттрибут из шага 1.
3. Открываем нужный товар данной категории, приложение автоматически показывает что нужно заполнить новое поле (зависит от правила валидации, нужно к обязательному заполнению или нет). Проводит валидацию введенного значения (правила берет из таблицы Аттрибуты выбранного поля).
4. На стороне сервера приложений также проводится валидация данных, если все ок, то поле parameters обновляется.

Задача 3. Удаляем запись из КатегорияТоваровАттрибуты, допольнительно удаляем запись из поля parameters в таблице Товары. Все это делается через транзакцию.

Я не вижу, где здесь СУБД контролирует целостность. Не даёт создать значение отсутствующего атрибута. Или удаляет все значения удалённого атрибута, или наоборот, запрещает удалить атрибут, если у него имеются значения.

EAV это делает. С JSONB никакого контроля со стороны БД нет.

А все потому что.

JSON/B/XML это не аналог EAV.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674291
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорСовершенно верно, все это аналоги, но все эти хранилища будут различаться по удобству, скорости, и т.д. Здесь я придерживаюсь варианта хранения динамических данных в жейсон поле. Вы пишете про схемы, давайте решать определенную задачу. В жейсоне я могу создать дополнительное поле 'validation_rules', в таблице справочнике Аттирибуты, и при добавление добавление, обновление этого поля, могу сделать валидацию. Как в EAV вы решаете эту задачу?

В атрибут добавится поле validation_rules. Вы лучше расскажите, как вы сделаете поле FK в json.
И как этот поле validation_rules будет помогать БД контролировать целостность, коректность данных? Не таким же образом который я написал?

hVosttПомидорЯ РСУБД использую как хранилище. Конечно обязательно пользуюсь возможностями целостности, правильности управления данными которые предоставляет РСУБД, но никто не отменял более сложные бизнес правила, которые притом еще динамические. И это не секрет никому, делаются на уровне сервера приложений. Что тогда меняет еще дополнительно проверять валидность данных на уровне приложения? Для очень загруженных систем как раз и применяют key-value store совместно с рсубд.

Да при чём тут более сложные бизнес правила? Мы говорим про сравнение JSON и EAV, а не про весь спект всех задач, решаемых в мире. И я говорю, это не аналоги. А вы начинаете про какую-то сложную бизнес-логигу блаблабла. При чём тут это вообще? При чём тут ваши способы решения валидации? Если они не в БД?
Вообще то я сразу же написал на каком уровне обеспечивается целостность данных в случае EAV и в случае жейсон. А задачу динамического атрибута решают оба и жейсон выигрывает.

hVosttПомидорВы кажется специально вводите, запутываете, собираете все в кучу. Транзакции как раз делаются на уровне БД. А вот читать данные можно и с памяти, чем и занимается редис например.

Это вы всё в кучу собираете. Я как раз пытаюсь стряхнуть пыль. То, что вы можете сохранить в поле JSON что угодно, не делает его аналогом EAV, что тут непонятного? Непонятно то, что если я используя жейсон поле достигаю того же эфекта как при eav, приэтом выигрываю во многом, и предлагаю использовать этот метод, а вы цепились за какие то мифический контроль целостности данных со стороны БД. Потому что целостность данных это не только обязательное присутствие каких то данных, но еще их коректность. И эту коректность вы полюбому будете делать на стороне приложения (на дворе 2018 год :) ) а не в БД.

hVosttПомидорВ указанной мной статье нигде не указанно что бы утверждаете. Жейсон везде выигрывает.

Со всеми приседаниями, которые требуется сделать, чтобы JSON выигрывал у EAV, оно не нужно и задаром.Вы признаете что жейсон выиграл спор скорости? Или оно вам до сих пор и задаром не нужно?

hVosttИ уж если вернуться к тебе разговора, что JSON это не аналог EAV, я уже озвучил почему, такие сравнения выглядят довольно смешными.

Хотите хранить в БД какой-то структурированный мусор с точки зрения БД, и управлять этим со стороны приложения, пожалуйста, используйте JSONB, можно даже в обычное текстовое поле запихивать JSON и это будет работать вообще на всех БД. Но это не EAV.Смешными выглядят ваши попытки уйти от темы, заниматься тафтологией. Это не попытка оскорбить вас, и заранее извиняюсь. Просто я понимаю что вы хотите сказать, но я хочу вам немного другое объяснить.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674293
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttЯ не вижу, где здесь СУБД контролирует целостность. Не даёт создать значение отсутствующего атрибута. Или удаляет все значения удалённого атрибута, или наоборот, запрещает удалить атрибут, если у него имеются значения.

EAV это делает. С JSONB никакого контроля со стороны БД нет.

А все потому что.

JSON/B/XML это не аналог EAV.
Ну я так сразу же писал что целостность контролируется на стороне приложения. Как можно удалить значения которые запрещены к удалению? На уровне приложения для этого делаются всякие тесты чтобы проконтролировать такие казусы, и это намного гибче. Ведь даже в случае с EAV вам иногда надо удалить запись с каскадным эфектом. Вы можете ошибиться приняв такое решение? Можете. И БД никак не поможет вам в этом.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674362
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорИ как этот поле validation_rules будет помогать БД контролировать целостность, коректность данных? Не таким же образом который я написал?

Точно таким же, как и для JSON. Какие-нибудь бизнес-ограничения на уровне приложения. Для ограничений целостности: по типу данных, по наличию атрибута, foreign key, будет проверка на уровне СУБД. И всего этого не будет на уровне СУБД для JSON.

ПомидорВообще то я сразу же написал на каком уровне обеспечивается целостность данных в случае EAV и в случае жейсон. А задачу динамического атрибута решают оба и жейсон выигрывает.

Вы сравниваете мяч и апельсин только на том основании, что они круглые.
Спор зашёл в тупик.

ПомидорНепонятно то, что если я используя жейсон поле достигаю того же эфекта как при eav, приэтом выигрываю во многом, и предлагаю использовать этот метод, а вы цепились за какие то мифический контроль целостности данных со стороны БД. Потому что целостность данных это не только обязательное присутствие каких то данных, но еще их коректность. И эту коректность вы полюбому будете делать на стороне приложения (на дворе 2018 год :) ) а не в БД.

Какая можеть КОРРЕКТНОСТЬ у непонятного значения в JSON с именем "хер_знает_что"? Вы чего городите? В EAV вы тупо не создадите значение для отсутствующего атрибута. И не сможете просто так грохнуть атрибут, если повесить NO ACTION в ограничениях целостности.

Я не против, если вы выбрали управлять корректностью полностью на строке приложения, ок. Спор не об этом. Выбрали, обосновали свой выбор -- ну и прекрасно.

Но с точки зрения хранения данных в СУБД это не одно и то же. Это не "аналоги", как часто это может звучать вследствие банальной неграмотности.

ПомидорВы признаете что жейсон выиграл спор скорости? Или оно вам до сих пор и задаром не нужно?

Нет, не признаю. На конкретном примере, крайне упрощённом и далёком от реальности, цифры не являются окончательным показателем. Что будет в разрезе отчётов с группировкой и подзапросами, на большом объёме данных? Что будет, если некоторые атрибуты меняются часта, а некоторые нет? Что будет, если для каждого значения атрибута нужно добавить ведение истории? Все эти задачи решаются на EAV в одинаковом ключе, для JSON от задачи придётся сильно менять и подходы и модель данных, что-то тащить в реляционку, что-то хранить в "куче".

ПомидорСмешными выглядят ваши попытки уйти от темы, заниматься тафтологией. Это не попытка оскорбить вас, и заранее извиняюсь. Просто я понимаю что вы хотите сказать, но я хочу вам немного другое объяснить.

Нет, не тафталогия. Когда говорят, что JSON это альтернатива EAV, это банальное распостранение заблуждений. И разные задачи решаются лучше разными способами. Не является ни в какой мере, утверждение, что "лучше будет, если EAV заменить JSON".
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674365
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорНу я так сразу же писал что целостность контролируется на стороне приложения. Как можно удалить значения которые запрещены к удалению? На уровне приложения для этого делаются всякие тесты чтобы проконтролировать такие казусы, и это намного гибче. Ведь даже в случае с EAV вам иногда надо удалить запись с каскадным эфектом. Вы можете ошибиться приняв такое решение? Можете. И БД никак не поможет вам в этом.

В EAV отлично работает каскад. Странно, что когда мы говорим о БД, вы смещаете фокус внимания на приложение. В таком случае, я повторюсь, совершенно пофигу что и как и где вы будете хранить, если всем будет управлять приложение.

На самом деле, я только приветствую и всячески поддерживаю, когда логика размещена в приложении, а не в СУБД. Но осуществлять базовые ограничения целостности именно модели размещения данных, таки задача СУБД.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674410
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорИ как этот поле validation_rules будет помогать БД контролировать целостность, коректность данных? Не таким же образом который я написал?

Точно таким же, как и для JSON. Какие-нибудь бизнес-ограничения на уровне приложения. Для ограничений целостности: по типу данных, по наличию атрибута, foreign key, будет проверка на уровне СУБД. И всего этого не будет на уровне СУБД для JSON.
Вот и выяснили что полюбому вам придеться проверять данные на уровне приложения. А теперь чтобы по типу данных была целостность, вам надо еще немного потрудиться чем простое EAV. А в простом EAV данные же храняться в текстовом формате. Для каждого типа создать свою таблица хранения, тогда давайте посмотрим как вы их потом соберете в одну!
Проверка на наличие атрибута большая проблема на жейсоне? Я вам наверху уже нарисовал примерную схему ограничения для произвольных атрибутов. Надеюсь вы не собираетесь руками что то подправлять в БД? Внешний ключ единственная проверка СУБД, а все остальное вам опять таки придеться делать на стороне приложения, тогда какая разница на одну проверку меньше или больше?

hVosttПомидорВообще то я сразу же написал на каком уровне обеспечивается целостность данных в случае EAV и в случае жейсон. А задачу динамического атрибута решают оба и жейсон выигрывает.

Вы сравниваете мяч и апельсин только на том основании, что они круглые.
Спор зашёл в тупик.
Я их сравниваю только потому что ту задачу которую мы решаем на основе модели eav можно эффективно решить применив немного другой подход с жейсоном.
hVosttПомидорНепонятно то, что если я используя жейсон поле достигаю того же эфекта как при eav, приэтом выигрываю во многом, и предлагаю использовать этот метод, а вы цепились за какие то мифический контроль целостности данных со стороны БД. Потому что целостность данных это не только обязательное присутствие каких то данных, но еще их коректность. И эту коректность вы полюбому будете делать на стороне приложения (на дворе 2018 год :) ) а не в БД.

Какая можеть КОРРЕКТНОСТЬ у непонятного значения в JSON с именем "хер_знает_что"? Вы чего городите? В EAV вы тупо не создадите значение для отсутствующего атрибута. И не сможете просто так грохнуть атрибут, если повесить NO ACTION в ограничениях целостности.

Я не против, если вы выбрали управлять корректностью полностью на строке приложения, ок. Спор не об этом. Выбрали, обосновали свой выбор -- ну и прекрасно.

Но с точки зрения хранения данных в СУБД это не одно и то же. Это не "аналоги", как часто это может звучать вследствие банальной неграмотности.
С точки зрения хранения данных конечно это совсем разные подходы, но под словом "аналог" я подразумеваю решения задачи. Ведь задача одна и та же в данном случае. КОРРЕКТНОСТЬ все таки есть, в базу данных даже админов не надо допускать что то подправить. А если все таки лезет, то пусть уже ознакомиться с значением "хер_знает_что". А вот для пользователей которым доступ к бд ограничен пользовательским интерфейсом, так они даже не почувствуют eav это или жейсон, они не смогут создать значение для отсутствующего атрибута. Им подавай ограничения на уровне приложения и скорость.
hVosttПомидорВы признаете что жейсон выиграл спор скорости? Или оно вам до сих пор и задаром не нужно?

Нет, не признаю. На конкретном примере, крайне упрощённом и далёком от реальности, цифры не являются окончательным показателем. Что будет в разрезе отчётов с группировкой и подзапросами, на большом объёме данных? Что будет, если некоторые атрибуты меняются часта, а некоторые нет? Что будет, если для каждого значения атрибута нужно добавить ведение истории? Все эти задачи решаются на EAV в одинаковом ключе, для JSON от задачи придётся сильно менять и подходы и модель данных, что-то тащить в реляционку, что-то хранить в "куче".
Ну так данный спор происходит на конкретной модели данных. В статье указан объем.
авторSELECT name
, properties ->> 'color'
, properties ->> 'country'
FROM entity_jsonb
WHERE id = 120;
Напишите аналог этого запроса на модели EAV. Тем более я могу через приложение гибко контролировать select часть, а в EAV? У вас там запрос полностью измениться.
Историю я веду не на колонки, а на строки. Занимает много места, но сейчас это уже не проблема. Зато позволяет сразу вытаскивать нужную информацию не применяя жойны.
hVosttПомидорСмешными выглядят ваши попытки уйти от темы, заниматься тафтологией. Это не попытка оскорбить вас, и заранее извиняюсь. Просто я понимаю что вы хотите сказать, но я хочу вам немного другое объяснить.

Нет, не тафталогия. Когда говорят, что JSON это альтернатива EAV, это банальное распостранение заблуждений. И разные задачи решаются лучше разными способами. Не является ни в какой мере, утверждение, что "лучше будет, если EAV заменить JSON".Хорошо, не жейсон, ведь это только формат данных, а метод на основе его, если для вас это будет более понятным. Хотя я изначально это и имел ввиду, как и автор статьи.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674413
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорНу я так сразу же писал что целостность контролируется на стороне приложения. Как можно удалить значения которые запрещены к удалению? На уровне приложения для этого делаются всякие тесты чтобы проконтролировать такие казусы, и это намного гибче. Ведь даже в случае с EAV вам иногда надо удалить запись с каскадным эфектом. Вы можете ошибиться приняв такое решение? Можете. И БД никак не поможет вам в этом.

В EAV отлично работает каскад. Странно, что когда мы говорим о БД, вы смещаете фокус внимания на приложение. В таком случае, я повторюсь, совершенно пофигу что и как и где вы будете хранить, если всем будет управлять приложение.

На самом деле, я только приветствую и всячески поддерживаю, когда логика размещена в приложении, а не в СУБД. Но осуществлять базовые ограничения целостности именно модели размещения данных, таки задача СУБД.
Так что мешает на жейсоне сделать каскад? Также отлично будет работать. Где хранить будет непофигу с точки зрения удобства, скорости, модификаций каких то. Поэтому рекомендую постгис где возможно как реляционка так и документо-ориентированность. :)
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674428
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорВот и выяснили что полюбому вам придеться проверять данные на уровне приложения. А теперь чтобы по типу данных была целостность, вам надо еще немного потрудиться чем простое EAV. А в простом EAV данные же храняться в текстовом формате. Для каждого типа создать свою таблица хранения, тогда давайте посмотрим как вы их потом соберете в одну!

А какие проблемы? Между прочим на EAV можно создать типы с JSON-ом

ПомидорПроверка на наличие атрибута большая проблема на жейсоне? Я вам наверху уже нарисовал примерную схему ограничения для произвольных атрибутов. Надеюсь вы не собираетесь руками что то подправлять в БД? Внешний ключ единственная проверка СУБД, а все остальное вам опять таки придеться делать на стороне приложения, тогда какая разница на одну проверку меньше или больше?

Разница в том, что статическая или динамическая схемы -- это всё равно схемы. А контролировать данные, которые должны соответствовать схеме должна БД, а не приложение. По крайне мере EAV это решает, JSON не решает.

ПомидорЯ их сравниваю только потому что ту задачу которую мы решаем на основе модели eav можно эффективно решить применив немного другой подход с жейсоном.

Ну json не решает задачь EAV. JSON + приложение, да. И то, с натягом. С большим.


ПомидорС точки зрения хранения данных конечно это совсем разные подходы, но под словом "аналог" я подразумеваю решения задачи.

Ну так какая задача? Хранить любой мусор? Конечно, JSON здесь намного лучше. Хранить строгий динамический набор атрибутов? Не, эту задачу JSON не решает. Там всё равно будет мусор, даже если ПО считает, что нет. С точки зрения БД, это какая-то куча данных. И всё.

ПомидорА вот для пользователей которым доступ к бд ограничен пользовательским интерфейсом, так они даже не почувствуют eav это или жейсон, они не смогут создать значение для отсутствующего атрибута. Им подавай ограничения на уровне приложения и скорость.

Это понятно. Но это за рамками дискуссии, ну очень далеко.

ПомидорНу так данный спор происходит на конкретной модели данных. В статье указан объем.

Так "объём", это не только количество записей. Если говорить про динамику, то это постоянно набирающая обороты сложность. Т.е. сложность растёт без вмешательства программиста. Проблемы, которые JSON не решает, не показаны в статье. Только скорость на одноклеточном примере, но с большим количеством записей.


ПомидоравторSELECT name
, properties ->> 'color'
, properties ->> 'country'
FROM entity_jsonb
WHERE id = 120;
Напишите аналог этого запроса на модели EAV. Тем более я могу через приложение гибко контролировать select часть, а в EAV? У вас там запрос полностью измениться.
Историю я веду не на колонки, а на строки. Занимает много места, но сейчас это уже не проблема. Зато позволяет сразу вытаскивать нужную информацию не применяя жойны.

Код: sql
1.
2.
3.
4.
5.
select e.name, 
   (select ev.value from e_values ev where ev.eid = e.id and ev.aid = 4) as color,
   (select ev.value from e_values ev where ev.eid = e.id and ev.aid = 5) as country
from e_entities e
where e.id = 120



буков больше?

Такие запросы также могут генериться приложением, никто руками их не пишет.

История на колоноки здесь бесплатно.
Возможность конвертить тип, не теряя данных бесплатно.
Делать быструю "колоночную" аналитику бесплатно.
Хранить к дополнительные данные к каждому значению бесплатно (на JSON вместо значения придётся делать структуру вместо примитива, а это увеличит сложность запросов просто драматически).
Быстрое обновление, проставить значения атрибута хоть для +100500 сущностей без проблем.
Контроль со стороны БД.
Настоящие ФК в значениях атрибутов.
Расширение вширь и в глубь, без изменения существующего кода.

Ну и конечно, сильная независимость от вендора, для кого-то это фигня, кто сидит пожизненно плотнячком на конкретной субд. Для нас, например, это важно, и это окупилось уже многократно.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674429
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорТак что мешает на жейсоне сделать каскад? Также отлично будет работать. Где хранить будет непофигу с точки зрения удобства, скорости, модификаций каких то. Поэтому рекомендую постгис где возможно как реляционка так и документо-ориентированность. :)

Какой каскад, со стороны аппликейшен? Ну это даже не смешно :)
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674465
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорВот и выяснили что полюбому вам придеться проверять данные на уровне приложения. А теперь чтобы по типу данных была целостность, вам надо еще немного потрудиться чем простое EAV. А в простом EAV данные же храняться в текстовом формате. Для каждого типа создать свою таблица хранения, тогда давайте посмотрим как вы их потом соберете в одну!

А какие проблемы? Между прочим на EAV можно создать типы с JSON-ом И на жейсон атрибут тоже можно запихнуть жейсон, будет иерархия жейсонов, которая кстати нативная

hVosttПомидорПроверка на наличие атрибута большая проблема на жейсоне? Я вам наверху уже нарисовал примерную схему ограничения для произвольных атрибутов. Надеюсь вы не собираетесь руками что то подправлять в БД? Внешний ключ единственная проверка СУБД, а все остальное вам опять таки придеться делать на стороне приложения, тогда какая разница на одну проверку меньше или больше?

Разница в том, что статическая или динамическая схемы -- это всё равно схемы. А контролировать данные, которые должны соответствовать схеме должна БД, а не приложение. По крайне мере EAV это решает, JSON не решает.Как БД контролирует данные которые должны соответствовать схеме? Например хотим в динамическом атрибуте хранить период даты, как она это проконтролирует?

hVosttПомидорЯ их сравниваю только потому что ту задачу которую мы решаем на основе модели eav можно эффективно решить применив немного другой подход с жейсоном.

Ну json не решает задачь EAV. JSON + приложение, да. И то, с натягом. С большим.
Почему с натягом? Полностью контролирует. По вашей логике то и бизнес правила тоже с натягом валидируются на уровне приложения? Если так, то где еще проверять данные?
hVosttПомидорС точки зрения хранения данных конечно это совсем разные подходы, но под словом "аналог" я подразумеваю решения задачи.

Ну так какая задача? Хранить любой мусор? Конечно, JSON здесь намного лучше. Хранить строгий динамический набор атрибутов? Не, эту задачу JSON не решает. Там всё равно будет мусор, даже если ПО считает, что нет. С точки зрения БД, это какая-то куча данных. И всё.Задача простая. Есть набор объектов, которые одного типа, имеют как похожие так и непохожие наборы атрибутов. И в дальнейшем могут добавляться атрибуты. Не могу понять почему вы все время указываете на мусор данных в случае жейсон.

hVosttПомидорА вот для пользователей которым доступ к бд ограничен пользовательским интерфейсом, так они даже не почувствуют eav это или жейсон, они не смогут создать значение для отсутствующего атрибута. Им подавай ограничения на уровне приложения и скорость.

Это понятно. Но это за рамками дискуссии, ну очень далеко. Все это взаимосвязанно. Ведь вы же не проектируете схему базы данных не учитывая дальнейшую ее эксплуатацию.

hVosttПомидорНу так данный спор происходит на конкретной модели данных. В статье указан объем.

Так "объём", это не только количество записей. Если говорить про динамику, то это постоянно набирающая обороты сложность. Т.е. сложность растёт без вмешательства программиста. Проблемы, которые JSON не решает, не показаны в статье. Только скорость на одноклеточном примере, но с большим количеством записей.


hVosttПомидор
Код: sql
1.
2.
3.
4.
5.
SELECT name
, properties ->> 'color'
, properties ->> 'country'
FROM entity_jsonb 
WHERE id = 120;



Напишите аналог этого запроса на модели EAV. Тем более я могу через приложение гибко контролировать select часть, а в EAV? У вас там запрос полностью измениться.
Историю я веду не на колонки, а на строки. Занимает много места, но сейчас это уже не проблема. Зато позволяет сразу вытаскивать нужную информацию не применяя жойны.

Код: sql
1.
2.
3.
4.
5.
select e.name, 
   (select ev.value from e_values ev where ev.eid = e.id and ev.aid = 4) as color,
   (select ev.value from e_values ev where ev.eid = e.id and ev.aid = 5) as country
from e_entities e
where e.id = 120



буков больше?

Такие запросы также могут генериться приложением, никто руками их не пишет.

История на колоноки здесь бесплатно.
Возможность конвертить тип, не теряя данных бесплатно.
Делать быструю "колоночную" аналитику бесплатно.
Хранить к дополнительные данные к каждому значению бесплатно (на JSON вместо значения придётся делать структуру вместо примитива, а это увеличит сложность запросов просто драматически).
Быстрое обновление, проставить значения атрибута хоть для +100500 сущностей без проблем.
Контроль со стороны БД.
Настоящие ФК в значениях атрибутов.
Расширение вширь и в глубь, без изменения существующего кода.

Ну и конечно, сильная независимость от вендора, для кого-то это фигня, кто сидит пожизненно плотнячком на конкретной субд. Для нас, например, это важно, и это окупилось уже многократно.

Хорошо, для вас много букв не проблема. А как насчет скорости этого запроса? Ведь автор как раз это и проверил, и пришел к выводу что жейсон метод в 15 тыч. быстрее. :) История на колонки как бесплатны? Можете подробнее в этом месте объяснить. Меняем для какого то объета значения динамического атрибута 'color' с RED на BLACK. Конвертить тип данных не бесплатно, а нагрузга для системы. Для жейсонб это уже нативно. :) Делать быструю "колоночную" аналитику делают немного другим методом, например можно в редис скинуть. :) Она уж точно будет быстрее вашей аналитики. Какие дополнительные данные к каждому значению можете хранить? Я не представляю. Жейсон изначально поддерживает вложенность, или дополнительные атрибуты к жейсон объекту. И сложность не растет драматически.
авторFor updating the data, this resulted in these execution times (in ms). Note that the scale is logarithmic:
Here, we see that the JSONB is much (>50000x) faster than EAV when not using any indexes, for the reason mentioned above. When we index the foreing key columns the difference is almost eliminated, but JSONB is still 1.3x faster than EAV. Notice that the index on the JSONB column does not have any effect here, as we don’t use the properties column in the criteria.
Как видите то что в вашем методе без проблем, в случае с жейсоном минимум 1.3 быстрее. :) Расширение вширь и в глубь жейсон метод не ограничивает ни как. Сильная зависимость от вендора для меня действительно не проблема на данный момент. Выбираю инструменты сам. Но вашу точку зрению я изначально понимал. Просто думаю скоро все вендоры реализуют такие фичи в любом случае.
Если не секрет то с какой субд на какую субд вы прыгнули?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674574
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорКак БД контролирует данные которые должны соответствовать схеме? Например хотим в динамическом атрибуте хранить период даты, как она это проконтролирует?
ну для начала можно на колонку повесить тип date, и тогда кроме даты туда уже ничего не вставить
"динамический атрибут периода даты" это started + closed
потом есть CONSTRAINTS , можно проверять, чтобы дата была в диапазоне, чтобы была уникальной, чтобы не пересекалась с другими таблицами (FK)
ничего из этого JSONB не умеет.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674593
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tip78ПомидорКак БД контролирует данные которые должны соответствовать схеме? Например хотим в динамическом атрибуте хранить период даты, как она это проконтролирует?
ну для начала можно на колонку повесить тип date, и тогда кроме даты туда уже ничего не вставить
"динамический атрибут периода даты" это started + closed
потом есть CONSTRAINTS , можно проверять, чтобы дата была в диапазоне, чтобы была уникальной, чтобы не пересекалась с другими таблицами (FK)
ничего из этого JSONB не умеет.
Сделайте все это в EAV модели.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674635
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделано уже многократно
этот функционал доступен из коробки
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674637
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы даже не умеет создавать колонки с типом date?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674658
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tip78вы даже не умеет создавать колонки с типом date?
Ваш поверхностный пример оставляет очень много вопросов, и у меня есть сомнения что у вас получиться это сделать именно с моделью EAV.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674686
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что не получится? дату создать? check повесить? FK прописать?
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674690
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
напишите что-то посерьёзнее парсера, типа CRM многопользовательской (а лучше 3), всё будет получаться
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674738
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПомидорКак БД контролирует данные которые должны соответствовать схеме? Например хотим в динамическом атрибуте хранить период даты, как она это проконтролирует?

Вариантов несколько, от разных таблиц для каждого типа, до одной таблицы с разными полями. Так или иначе, в поле типа timestamp вы не засунете, например, GUID, строку или дробное число. В JSON можно засунуть что угодно. В БД больше типов, которые она контролирует.

ПомидорПочему с натягом? Полностью контролирует. По вашей логике то и бизнес правила тоже с натягом валидируются на уровне приложения? Если так, то где еще проверять данные?

Нет, не контролирует. Foreign Key, например. Типы. Бизнес-правила это совершенно другая опера. Есть конечно решения, которые пытаются вести бизнес-правила на уровен БД (триггеры, ХП...), но я абсолютный противник этого, так как это прошлый век и вообще убого.

ПомидорЗадача простая. Есть набор объектов, которые одного типа, имеют как похожие так и непохожие наборы атрибутов. И в дальнейшем могут добавляться атрибуты. Не могу понять почему вы все время указываете на мусор данных в случае жейсон.

Потому что с точки зрения БД, это структурированная куча.

ПомидорВсе это взаимосвязанно. Ведь вы же не проектируете схему базы данных не учитывая дальнейшую ее эксплуатацию.

Всё верно, поэтому ограничения целостности БД, это очень важная составляющая при проектировании. При использовании JSON, этим приходится пожертвовать, понадеясь на то, что ПО всё разрулит. Но это плохая практика.

ПомидорХорошо, для вас много букв не проблема. А как насчет скорости этого запроса? Ведь автор как раз это и проверил, и пришел к выводу что жейсон метод в 15 тыч. быстрее.

В 15 тыс.? Нет конечно, не быстрее. Скорость уступает статической схеме. Но и JSON уступает статической схеме, так что.

Если вас интересует в первую очередь скорость, вы должны отказаться от EAV, JSONB и прочих костылей. И динамически изменять саму схему БД, чтобы иметь максимальную производительность, а также хорошую сопровождаемость запросов.

ПомидорИстория на колонки как бесплатны? Можете подробнее в этом месте объяснить.

Достаточно вести в любой таблице (Timestapm, EntityId, AttributeId, Value), так как у вас идентификаторы атрибутов. В JSON их нет, только названия колонок, в EAV у атрибута может быть сколько угодно параметров.

ПомидорКонвертить тип данных не бесплатно, а нагрузга для системы. Для жейсонб это уже нативно. :)

Абсолютный ноль нагрузки в случае EAV. Меняем тип атрибута, и может сконвертить все значения атрибута в новый тип, что сконвертится — запишется, при этом все старые значения старого типа останутся в неизменном состоянии, т.е. можно вернуться обратно и получить все свои старые значения обратно. Бесплатно.

Для JSON придётся выполнить изменение всей структуры, так как в JSON нет UPDATE для одного атрибута (синтаксически он есть, но по факту, это изменения всего набора). Конвертирование убивает старое значение, если вы конечно не хотите оставить всё в неопределённом состоянии, когда поле JSON сразу хранит данные разного типа, что очень очень плохо.

ПомидорДелать быструю "колоночную" аналитику делают немного другим методом, например можно в редис скинуть. :)

Да, можно. Но это не бесплатно.

ПомидорОна уж точно будет быстрее вашей аналитики.

За счёт чего, интересно? Тут унылая БД, а там термоядерное волшебство на стероидах?

ПомидорКакие дополнительные данные к каждому значению можете хранить? Я не представляю. Жейсон изначально поддерживает вложенность, или дополнительные атрибуты к жейсон объекту. И сложность не растет драматически.

Да легко, например, кто автор изменений данного значения, когда изменилось значение этого поля (а не всей строки). Т.е. ещё и бесплатный аудит на борту :)

Да, джейсон поддерживает вложенность. Но это опять таки, не контролируется БД. Что вы там вложили, с точки зрения БД это та же куча. И запросы станут сложнее. А для EAV они вообще не изменятся.

ПомидорКак видите то что в вашем методе без проблем, в случае с жейсоном минимум 1.3 быстрее. :)

Как я уже сказал. Если хотите скорости, то EAV вместе с JSONB отстают от статики. Ведите проекции в статических таблицах. Для EAV можно делать материализованные представления, где требуется мега-скорость, но это те же костыли, которые можно делать и для JSON. Поэтому для скорости и производительности, нужно выбирать другие подходы, а не менять одни костыли на другие.

ПомидорЕсли не секрет то с какой субд на какую субд вы прыгнули?

Мы поддерживаем минимум три СУБД в наших проектах: MS SQL, Oracle, Postgres. За счёт архитектуры, позволяющей просто писать провайдеры для СУБД, мы смогли для отдельного случая поятнуть ещё одну СУБД без существенных затрат.

Это не значит, что мы вообще, например, отказываемся от JSONB, просто надо понимать, что это структура по сути куча. Надо всегда это понимать, и работать с ней соответствующим образом.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674763
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttПомидорКак БД контролирует данные которые должны соответствовать схеме? Например хотим в динамическом атрибуте хранить период даты, как она это проконтролирует?

Вариантов несколько, от разных таблиц для каждого типа, до одной таблицы с разными полями. Так или иначе, в поле типа timestamp вы не засунете, например, GUID, строку или дробное число. В JSON можно засунуть что угодно. В БД больше типов, которые она контролирует.
Все EAV считают костылем в рсубд, но вы тут делаете "открытия". Вы конечно можете засунуть в разные поля. Поэтому я прошу вас показать пример как вы потом будете делать отчеты, собирать данные обратно в один объект. :)

hVosttПомидорПочему с натягом? Полностью контролирует. По вашей логике то и бизнес правила тоже с натягом валидируются на уровне приложения? Если так, то где еще проверять данные?

Нет, не контролирует. Foreign Key, например. Типы. Бизнес-правила это совершенно другая опера. Есть конечно решения, которые пытаются вести бизнес-правила на уровен БД (триггеры, ХП...), но я абсолютный противник этого, так как это прошлый век и вообще убого.

hVosttПомидорЗадача простая. Есть набор объектов, которые одного типа, имеют как похожие так и непохожие наборы атрибутов. И в дальнейшем могут добавляться атрибуты. Не могу понять почему вы все время указываете на мусор данных в случае жейсон.

Потому что с точки зрения БД, это структурированная куча.

hVosttПомидорВсе это взаимосвязанно. Ведь вы же не проектируете схему базы данных не учитывая дальнейшую ее эксплуатацию.

Всё верно, поэтому ограничения целостности БД, это очень важная составляющая при проектировании. При использовании JSON, этим приходится пожертвовать, понадеясь на то, что ПО всё разрулит. Но это плохая практика.

hVosttПомидорХорошо, для вас много букв не проблема. А как насчет скорости этого запроса? Ведь автор как раз это и проверил, и пришел к выводу что жейсон метод в 15 тыч. быстрее.

В 15 тыс.? Нет конечно, не быстрее. Скорость уступает статической схеме. Но и JSON уступает статической схеме, так что.

Если вас интересует в первую очередь скорость, вы должны отказаться от EAV, JSONB и прочих костылей. И динамически изменять саму схему БД, чтобы иметь максимальную производительность, а также хорошую сопровождаемость запросов.

hVosttПомидорИстория на колонки как бесплатны? Можете подробнее в этом месте объяснить.

Достаточно вести в любой таблице (Timestapm, EntityId, AttributeId, Value), так как у вас идентификаторы атрибутов. В JSON их нет, только названия колонок, в EAV у атрибута может быть сколько угодно параметров.

hVosttПомидорКонвертить тип данных не бесплатно, а нагрузга для системы. Для жейсонб это уже нативно. :)

Абсолютный ноль нагрузки в случае EAV. Меняем тип атрибута, и может сконвертить все значения атрибута в новый тип, что сконвертится — запишется, при этом все старые значения старого типа останутся в неизменном состоянии, т.е. можно вернуться обратно и получить все свои старые значения обратно. Бесплатно.

Для JSON придётся выполнить изменение всей структуры, так как в JSON нет UPDATE для одного атрибута (синтаксически он есть, но по факту, это изменения всего набора). Конвертирование убивает старое значение, если вы конечно не хотите оставить всё в неопределённом состоянии, когда поле JSON сразу хранит данные разного типа, что очень очень плохо.

hVosttПомидорДелать быструю "колоночную" аналитику делают немного другим методом, например можно в редис скинуть. :)

Да, можно. Но это не бесплатно.

hVosttПомидорОна уж точно будет быстрее вашей аналитики.

За счёт чего, интересно? Тут унылая БД, а там термоядерное волшебство на стероидах?

hVosttПомидорКакие дополнительные данные к каждому значению можете хранить? Я не представляю. Жейсон изначально поддерживает вложенность, или дополнительные атрибуты к жейсон объекту. И сложность не растет драматически.

Да легко, например, кто автор изменений данного значения, когда изменилось значение этого поля (а не всей строки). Т.е. ещё и бесплатный аудит на борту :)

Да, джейсон поддерживает вложенность. Но это опять таки, не контролируется БД. Что вы там вложили, с точки зрения БД это та же куча. И запросы станут сложнее. А для EAV они вообще не изменятся.

hVosttПомидорКак видите то что в вашем методе без проблем, в случае с жейсоном минимум 1.3 быстрее. :)

Как я уже сказал. Если хотите скорости, то EAV вместе с JSONB отстают от статики. Ведите проекции в статических таблицах. Для EAV можно делать материализованные представления, где требуется мега-скорость, но это те же костыли, которые можно делать и для JSON. Поэтому для скорости и производительности, нужно выбирать другие подходы, а не менять одни костыли на другие.

hVosttПомидорЕсли не секрет то с какой субд на какую субд вы прыгнули?

Мы поддерживаем минимум три СУБД в наших проектах: MS SQL, Oracle, Postgres. За счёт архитектуры, позволяющей просто писать провайдеры для СУБД, мы смогли для отдельного случая поятнуть ещё одну СУБД без существенных затрат.

Это не значит, что мы вообще, например, отказываемся от JSONB, просто надо понимать, что это структура по сути куча. Надо всегда это понимать, и работать с ней соответствующим образом.
...
Рейтинг: 0 / 0
Пронетирование бд электроэнергетических устройств
    #39674773
Помидор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошлое сообщение было по ошибке отправлено. Не могу отредактировать. Поэтому это новое.
hVosttпропущено...


Вариантов несколько, от разных таблиц для каждого типа, до одной таблицы с разными полями. Так или иначе, в поле типа timestamp вы не засунете, например, GUID, строку или дробное число. В JSON можно засунуть что угодно. В БД больше типов, которые она контролирует.
Все EAV считают костылем в рсубд, но вы тут делаете "открытия". Вы конечно можете засунуть в разные поля. Поэтому я прошу вас показать пример как вы потом будете делать отчеты, собирать данные обратно в один объект. :)
hVosttпропущено...
Нет, не контролирует. Foreign Key, например. Типы. Бизнес-правила это совершенно другая опера. Есть конечно решения, которые пытаются вести бизнес-правила на уровен БД (триггеры, ХП...), но я абсолютный противник этого, так как это прошлый век и вообще убого.
Контролируется запросто. И типы контролируются. Бизнес правила определяют тип данных. Поэтому отделять их от базовых проверок данных не могу представить.
hVosttпропущено...
Потому что с точки зрения БД, это структурированная куча.
Я БД рассмотриваю просто как хранилище. Что я туда положу и в каком виде, в таком виде я и получаю.
hVosttпропущено...
Всё верно, поэтому ограничения целостности БД, это очень важная составляющая при проектировании. При использовании JSON, этим приходится пожертвовать, понадеясь на то, что ПО всё разрулит. Но это плохая практика.А почему ПО не может разрулить? Поэтому я спрашивал немного раньше, вы что голыми руками лезете в БД что то подправить? Это хорошая практика?
hVosttпропущено...
В 15 тыс.? Нет конечно, не быстрее. Скорость уступает статической схеме. Но и JSON уступает статической схеме, так что.

Если вас интересует в первую очередь скорость, вы должны отказаться от EAV, JSONB и прочих костылей. И динамически изменять саму схему БД, чтобы иметь максимальную производительность, а также хорошую сопровождаемость запросов.
Все зависит от структуры данных и операций над этими данными. И да, для этой задачи жсонб отлично подходит, и превосходит EAV модель в рсубд. А то что вы теоритизируете это конечно отлично, и всем известно, но для нашего обсуждения малопригодно.
hVosttпропущено...
Достаточно вести в любой таблице (Timestapm, EntityId, AttributeId, Value), так как у вас идентификаторы атрибутов. В JSON их нет, только названия колонок, в EAV у атрибута может быть сколько угодно параметров.
В каким виде у EAV атрибута может быть сколько угодно параметров? И я вам напишу жейсон решение :).
hVosttпропущено...
Абсолютный ноль нагрузки в случае EAV. Меняем тип атрибута, и может сконвертить все значения атрибута в новый тип, что сконвертится — запишется, при этом все старые значения старого типа останутся в неизменном состоянии, т.е. можно вернуться обратно и получить все свои старые значения обратно. Бесплатно.

Для JSON придётся выполнить изменение всей структуры, так как в JSON нет UPDATE для одного атрибута (синтаксически он есть, но по факту, это изменения всего набора). Конвертирование убивает старое значение, если вы конечно не хотите оставить всё в неопределённом состоянии, когда поле JSON сразу хранит данные разного типа, что очень очень плохо.
Ничего в жейсоне не будем менять, данные там не будут конвертироваться, они уже лежат в нужном типе. :).
Кстати вопрос, зачем вам конвертировать старые значения на новые? Это уже плохая практика. :) Вы же писали что контролируете тип данных, и тут на тебе, приходиться конвертировать почему то значения атрибутов на новые значения. :) В жейсоне если придется как преобразовывать значения, то и старое можно оставить до того момента когда уже точно знаем что можем удалить, подчистить, и новое уже применять. А вам придется туго чтобы такое проделать. :)
hVosttпропущено...
Да, можно. Но это не бесплатно.
Бесплатно если учесть что она не только эту задачу выполняет, а кучу еще в добавок. Я не представляю высоконагруженную систему которая не использует редис или его подобною систему в придачу к рсубд.
hVosttпропущено...
За счёт чего, интересно? Тут унылая БД, а там термоядерное волшебство на стероидах?
Не термоядерное волшебсто, а чистая математика.
hVosttпропущено...
Да легко, например, кто автор изменений данного значения, когда изменилось значение этого поля (а не всей строки). Т.е. ещё и бесплатный аудит на борту :)

Да, джейсон поддерживает вложенность. Но это опять таки, не контролируется БД. Что вы там вложили, с точки зрения БД это та же куча. И запросы станут сложнее. А для EAV они вообще не изменятся.
Прошу показать структуру данных, тогда и можно увидеть как вы отслеживаете историю данных. Почему то мне кажется что у вас только поля created_at, created_by, updated_at, updated_by. :) Это конечно отлично, дает быструю информацию, но это может оказаться не полная история кто что где какие данные менял на что.
hVosttпропущено...
Как я уже сказал. Если хотите скорости, то EAV вместе с JSONB отстают от статики. Ведите проекции в статических таблицах. Для EAV можно делать материализованные представления, где требуется мега-скорость, но это те же костыли, которые можно делать и для JSON. Поэтому для скорости и производительности, нужно выбирать другие подходы, а не менять одни костыли на другие.
Может и отстают. Но я за жейсон метод пишу не только из-за этого. Она пока дает преимущество в удобстве, скорости использования в отличие от EAV. Вести проекции в статических таблицах можно, но это уже костыль очень большой. Никому это и даром не нужно. Поэтому и придумали EAV и подобные ему методы. :)
hVosttпропущено...
Мы поддерживаем минимум три СУБД в наших проектах: MS SQL, Oracle, Postgres. За счёт архитектуры, позволяющей просто писать провайдеры для СУБД, мы смогли для отдельного случая поятнуть ещё одну СУБД без существенных затрат.

Это не значит, что мы вообще, например, отказываемся от JSONB, просто надо понимать, что это структура по сути куча. Надо всегда это понимать, и работать с ней соответствующим образом. Это понимание есть. И как это использовать тоже понимания есть.
...
Рейтинг: 0 / 0
106 сообщений из 106, показаны все 5 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Пронетирование бд электроэнергетических устройств
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]