|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Eugene Хочу спроектировать базу электроэнергетических устройств (имеется ввиду самый основной уровень, когда не рассматриваем элементы, детали устройств, коммуникационное оборудование, провод) Сначала взял стандартную схему БД подобного типа Но потом понял что нельзя делать одну табл Оборудование для ВСЕХ ТИПОВ устройств. В самом деле, в физике и электроэнергетики есть разные классификации каждого типа устройств, сам тип оборудования иногдв является не линейным а деревом. Так для типа Электродвигатель основные подтипы -постоянного-переменного тока. Для переменного тока -следующий уровень-синхронный-асинхронный Кроме того желательно отразить в БД не одну а несколько классификаций, причем разных для каждого типа устройства. Например, электрогенераторы - по виду выходного электр тока -Постоянного, переменного -по фазности выходного напряжения – на однофазные и трехфазные; -по типу используемого топлива - дизельный, бензиновый и газовый и т д т.е в отличие от приведенной выше схемы, под самой верхней сущностью ТИПОборудования должно стоять не одна табл ОБОРУДОВАНИЕ а НЕСКОЛЬКО, т.е. ЭЛЕКТРОДВИГАТЕЛИ , ЭЛЕКТРОГЕНЕРАТОРЫ, ИсточникиСВЕТА , ИсточникиВторичногоПитания (подтипы:хит (гальванич элем, батареи и акк), термобатареи, термоэлектр преобразователи, фотоэлектрич преобразователи...) Возникает вопрос о проектировании такой структуры. т.е база -это фактическое соединение почти на верхнем уровне разнородных сущностей таблиц. Можно ли так делать? Не имел опыт. Что ,Все запросы SELECT придется писать в форме SELECT CASE? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 09:47 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
eugene, Нужно реализовать бизнес-наследование. Например, в сущности ТипОборуд добавить поле КодРодительскогоТипа. Но лучше поддерживать множественное наследование, правда это будет дороже. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:00 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
eugene,Все запросы SELECT придется писать в форме SELECT CASE? Так как это EAV, запросы будут адскими, да. В таком случае всегда имеет смысл вести отдельно проекции, но это вообще не популярная практика. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:01 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Поищите по ключевому слову EAV ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:06 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostt, расшифруйте термин EAV ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:25 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostt, Что имеете ввиду под термином бизнес-наследование? У меня под рукой самая простая СУБД -MS Access. Дальше SQL Server и глядеть не хочу. Если имеете ввиду объектно-ориентированные типа Jasmine - это мне не по карману Я думаю что все-таки надо начать с древовидного классификатора Тип оборудования и запихнуть его в таблицу как запихивают в СУБД деревья. Правда у моей предметной области получается классификация не иерархическая а сетевая ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:30 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
eugeneКроме того желательно отразить в БД не одну а несколько классификаций, причем разных для каждого типа устройства. Например, электрогенераторы - по виду выходного электр тока -Постоянного, переменного -по фазности выходного напряжения – на однофазные и трехфазные; -по типу используемого топлива - дизельный, бензиновый и газовый и т д Это называется фасетная классификация. Имеет вполне проработанные хорошие решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:36 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
eugeneВозникает вопрос о проектировании такой структуры. т.е база -это фактическое соединение почти на верхнем уровне разнородных сущностей таблиц. Можно ли так делать? Не имел опыт. Что ,Все запросы SELECT придется писать в форме SELECT CASE? Начните с того, что опишите как собираетесь использовать эти данные. Какие задачи должны решаться? Каталог оборудования только ради каталога лишен смысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 11:34 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
eugene, Подумайте над задачей, над тем, что в конечном счёте нужно. EAV гуглится, остальное пока рано. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 11:49 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
eugeneТак для типа Электродвигатель основные подтипы -постоянного-переменного тока. Для переменного тока -следующий уровень-синхронный-асинхронный Кроме того желательно отразить в БД не одну а несколько классификаций, причем разных для каждого типа устройства. https://habr.com/post/254773/ читайте, практикуйтесь пока до конца не поймёте хотя бы первые 3 формы, дальше не суйтесь ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 12:50 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 12:57 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78 4 альтернативы EAV я бы не назвал их альтернативами ни при каком раскладе. EAV это динамическая модель атрибутов, которая всё же укладывается в реляционную структуру, а указанные inheritance это статическая, а LOB это вообще что угодно, без гарантий и контроля. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 13:12 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostttip78 4 альтернативы EAV я бы не назвал их альтернативами ни при каком раскладе. ...+500. Все 4 практически непригодны для реальных условий. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 13:48 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ну, поговоривают, что магенто перешло на flat tables (в списке толи 1, толи 3), сам правда не видел, не пользуюсь альтернатива в том плане, что это всё ещё таблицы я сам то предпочитаю всё что можно в редиске хранить ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 14:27 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78я сам то предпочитаю всё что можно в редиске хранить сложные отчёты по редиске делали когда-нибудь? всёж инструмент надо выбирать не по принципу "предпочитаю", а исходя из задач и требований. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 15:03 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostttip78я сам то предпочитаю всё что можно в редиске хранить сложные отчёты по редиске делали когда-нибудь? всёж инструмент надо выбирать не по принципу "предпочитаю", а исходя из задач и требований. 10 таблиц с фильтрами это сложные ? такое проще агрегировать, по возможности (а она практически всегда есть) редис он больше для внешнего мира нужен, а отчётность это скорее внутри, в CRM ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 17:23 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
L_argohVosttпропущено... я бы не назвал их альтернативами ни при каком раскладе. ...+500. Все 4 практически непригодны для реальных условий. Что скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/ ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 06:56 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорЧто скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/ Судя по статье, в решении с JSONB, нет схемы. В то время, как в реляционном исполнении она есть. Нельзя создать значение несуществующего Property. В JSONB можно, и набор значений свойст не контролируется со стороны БД. Ничего против не имею, даже за в отдельных случаях, но так сравнивать нельзя. Это разное. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 08:49 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорL_argoпропущено... +500. Все 4 практически непригодны для реальных условий. Что скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/ Где это работает (и не хуже) кроме как в ПостГре ? Какова доля ПостГре на рынке СУБД ? зы: ничеталъ ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 09:38 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Помидор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 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 11:53 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
* Таблица, где ID + json b CREATE TABLE bad_tbl(id serial,json json b ) = НЕправильная таблица. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 11:54 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttПомидорЧто скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/ Судя по статье, в решении с JSONB, нет схемы. В то время, как в реляционном исполнении она есть. Нельзя создать значение несуществующего Property. В JSONB можно, и набор значений свойст не контролируется со стороны БД. Ничего против не имею, даже за в отдельных случаях, но так сравнивать нельзя. Это разное. Ну может в этой статье ничего не сказано как ограничить администратора системы который собственно и решает надо добавлять новое поле или нет, но большой разницы с eav не вижу. Да, в случае с eav это ограничение на основе внешних ключей на уровне базы данных, а в случае с жейсон эту же логику ограничений можно сделать на уровне приложения. Скажем администратор системы решил быть таким и таким полям, а модератор хочет обойти это решение, хочет добавить дополнительное поле, это очень легко решается как и в случае с eav моделем. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 17:45 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
L_argoПомидорпропущено... Что скажете на это?! http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/ Где это работает (и не хуже) кроме как в ПостГре ? Какова доля ПостГре на рынке СУБД ? зы: ничеталъ Тут важно (не обращая внимания на конкретную СУБД) действительно ли такое решение работает лучше или хуже. В случае с постгрес вроде добились хороших результатов, это в статье указано, значит пойдет тенденция и у других производителей субд. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 17:49 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78дальше можно не читать. JSONB никогда не заменит EAV, хотя бы потому, что там индексы много хуже работают. И сложный поиск там вообще труба. И не GiN, ни jsonb_path_ops, ни jsquery тут не помогут. Производительность падает и запросы становятся сложнее. Jsonb_path_ops хоть и быстрее монги, но он узконаправленный для очень простых случаев. Индексы там работают очень хорошо, это показано в статье. Чем же сложный поиск там труба? Можете на примере с eav моделю показать такой сложный запрос, сравним как эстетическую сторону вопроса так и производительную часть. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 18:02 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78* Таблица, где ID + json b CREATE TABLE bad_tbl(id serial,json json b ) = НЕправильная таблица. В случае с постгерс ни не заставляет все поля кроме первичного ключа загонять в жейсон поле. Жейсон поле просто приятная возможность чтобы не плодить лишние сущности в базе, причем очень эффективная. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 18:08 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Помидор, берите любой многоуровневый 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]почитайте внимательно доки и послушайте Бартунова перед сном: ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 19:50 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78Помидор, берите любой многоуровневый JSON Ээ, а при чем тут "многоуровневый JSON"? Вы же вроде c EAV-моделью собрались сравнивать - какая это EAV-модель требует для отображения именно многоуровневый JSON для каждого entity? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 20:00 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот Матроскин, а это что по-вашему? Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 20:17 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ну и далее, соот-но: WHERE t3.a = x AND t4.b = y ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 20:18 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78 Кот Матроскин, а это что по-вашему?А это сбор одной строки. Достать одну строку с BLOB (а это можеть быть хоть JSON хоть XML) в разы быстрее чем в EAV. И вероятность накосячить у EAV выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 20:50 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78Кот Матроскин, а это что по-вашему? Какой-то незаконченный запрос непонятно чего :) может сойти в качестве примера "как не надо называть объекты в БД". Я спросил структуру EAV (т.е., грубо говоря, какие сущности с какими атрибутами Вы планируете в ней хранить). И почему-то мне кажется, что в JSON-ах, хранящих эти атрибуты для каждой сущности, вполне можно будет обойтись одним уровнем. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 20:58 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорНу может в этой статье ничего не сказано как ограничить администратора системы который собственно и решает надо добавлять новое поле или нет, но большой разницы с eav не вижу. Да, в случае с eav это ограничение на основе внешних ключей на уровне базы данных, а в случае с жейсон эту же логику ограничений можно сделать на уровне приложения. Тогда postgres здесь как бы не упёрся, берём монгу или другое документо-ориентированное хранилище и привет. Суть именно EAV в сохранении ограничений целостности БД, хоть в какой-то мере. ПомидорСкажем администратор системы решил быть таким и таким полям, а модератор хочет обойти это решение, хочет добавить дополнительное поле, это очень легко решается как и в случае с eav моделем. Это бардак. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:01 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорВ случае с постгерс ни не заставляет все поля кроме первичного ключа загонять в жейсон поле. Жейсон поле просто приятная возможность чтобы не плодить лишние сущности в базе, причем очень эффективная. Эффективная, но это не альтернатива EAV, в полной мере так сказать. Это другое. Например, со стороны приложения запихать каких-то полей, чудоковатых, при чём у каждой записи вообще свой набор полей. Или сохранить объектную структуру документа, да много чего. Но это не EAV. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:02 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostt Но это не EAV. Какая задача, легко решаемая EAV, не может быть решена при помощи подхода с JSON/XML? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:07 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostt Суть именно EAV в сохранении ограничений целостности БД, хоть в какой-то мереЭто какие такие ограничения накладывает EAV? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:11 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот МатроскинhVostt Но это не EAV. Какая задача, легко решаемая EAV, не может быть решена при помощи подхода с JSON/XML? Ну давайте посмотрим. Независимость от конкретных РСУБД. Ограничения целостности (не может быть значений отсутствующих атрибутов). Расширенный EAV мог бы вести типовые значения в отдельных таблицах или колонках, т.е. спектр типов, поддерживаемый БД шире JSON, даже в понятиях ANSI. Ну XML слишком жирный, хотя поддерживаемых примитивных типов больше. И "решена", имеется в виду средствами БД. Так как если сводить на уровень приложения, вообще всё можно решить, даже без БД )) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:20 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
SERG1257hVosttСуть именно EAV в сохранении ограничений целостности БД, хоть в какой-то мереЭто какие такие ограничения накладывает EAV? Нельзя создать значение для отсутствующего атрибута. Можно запретить удаление атрибута при наличии значений. Если создавать типовые колонки или таблицы значений, можно задать соответственно типовые ограничения, в том числе ссылки. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:22 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот Матроскинtip78Кот Матроскин, а это что по-вашему? Какой-то незаконченный запрос непонятно чего :) может сойти в качестве примера "как не надо называть объекты в БД". Я спросил структуру EAV (т.е., грубо говоря, какие сущности с какими атрибутами Вы планируете в ней хранить). как это "непонятно чего"? Обычная отчётность захватывает кучу таблиц и требует их фильтрации. Поиск свойств товаров. Любые случаи, которые не решаются простым "overlaps". авторИ почему-то мне кажется, что в JSON-ах, хранящих эти атрибуты для каждой сущности, вполне можно будет обойтись одним уровнем. я не пойму, вы никогда не видели многоуровневые JSON-ы? Берёте любой и ищите значение из последней группы, а потом сравниваете с поиском в отдельных колонках. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:27 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
SERG1257tip78 Кот Матроскин, а это что по-вашему?А это сбор одной строки. Достать одну строку с BLOB (а это можеть быть хоть JSON хоть XML) в разы быстрее чем в EAV. И вероятность накосячить у EAV выше. не достать. НАЙТИ! В последней ветке. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:28 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttКот Матроскинпропущено... Какая задача, легко решаемая EAV, не может быть решена при помощи подхода с JSON/XML? Ну давайте посмотрим. Независимость от конкретных РСУБД. Вполне достигается :) Вряд ли найдется СУБД, которая не сможет хранить XML/JSON. Возможно, не получится эффективно искать в них - ну так опаньки, "независимость от конкретных СУБД" вообще плохо сочетается с максимальной эффективностью, тут снявши голову по волосам не плачут. hVostt Ограничения целостности (не может быть значений отсутствующих атрибутов). У XML и JSON внезапно есть схемы :) Возможности которых гораздо шире, чем "не может быть значений отсутствующих атрибутов". Так что тут минус у EAV. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:36 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78Кот Матроскинпропущено... Какой-то незаконченный запрос непонятно чего :) может сойти в качестве примера "как не надо называть объекты в БД". Я спросил структуру EAV (т.е., грубо говоря, какие сущности с какими атрибутами Вы планируете в ней хранить). как это "непонятно чего"? Обычная отчётность захватывает кучу таблиц и требует их фильтрации. Я еще раз напоминаю, что Вы собрались сравнивать EAV . Так что давайте будем смотреть запрос сущностей, лежащих в EAV, и по атрибутам, тоже лежащим в EAV. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:41 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот МатроскинВполне достигается :) Вряд ли найдется СУБД, которая не сможет хранить XML/JSON. Возможно, не получится эффективно искать в них - ну так опаньки, "независимость от конкретных СУБД" вообще плохо сочетается с максимальной эффективностью, тут снявши голову по волосам не плачут. Вот не надо. Классический EAV, будет примерно одинаковый на широком спектре СУБД и примерно одинаково будет работать по скорости. Инструменты для работы с XML/JSON в разных СУБД, если они есть, то работа с ними отличается полностью. А хранить типа в string, ну это извините, уже за рамками дискуссии. Можно всю БД таким образом хранить в одном поле одной записи в XML. Кот МатроскинУ XML и JSON внезапно есть схемы :) Динамические схемы? Которые проверяются со стороны БД? Нет? Тогда не очень тут говорить :) Кот МатроскинВозможности которых гораздо шире, чем "не может быть значений отсутствующих атрибутов". Так что тут минус у EAV. Это поддерживается СУБД? В динамике? Нет? Ну а чего тогда. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:46 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostt Кот МатроскинУ XML и JSON внезапно есть схемы :) Динамические схемы? Что имеется в виду под "динамическими схемами"? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 21:51 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот МатроскинЧто имеется в виду под "динамическими схемами"? Значит новые атрибуты добавляются/изменяются как данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 22:01 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttКот МатроскинЧто имеется в виду под "динамическими схемами"? Значит новые атрибуты добавляются/изменяются как данные. Они добавляются и изменяются, но не "как данные" (и это, опять же, плюс, а не минус). Путать в один винегрет данные и метаданные - это родимое пятно EAV, странно это считать достоинством. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 22:15 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот МатроскинhVosttпропущено... Значит новые атрибуты добавляются/изменяются как данные. Они добавляются и изменяются, но не "как данные" (и это, опять же, плюс, а не минус). Путать в один винегрет данные и метаданные - это родимое пятно EAV, странно это считать достоинством. В этом весь смысл EAV, а не достоинство. Иначе нафига мне эти JSON с XML-ем упёрлись, если я просто могу создавать таблицы и налаживать между ними связи? Как обычно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 22:49 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот Матроскинtip78пропущено... как это "непонятно чего"? Обычная отчётность захватывает кучу таблиц и требует их фильтрации. Я еще раз напоминаю, что Вы собрались сравнивать EAV . Так что давайте будем смотреть запрос сущностей, лежащих в EAV, и по атрибутам, тоже лежащим в EAV. ну так разложите дерево JSON по таблицам и сравнивайте. Я про это говорю уже 3й пост. Или откройте видео на 25:00 и послушайте минуту самих разработчиков. Кстати, hVostt напомнил ещё один важный момент - даже цифры там являются текстом. Т.е. скорость поиска падает уже даже на этом простом факте. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 23:08 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
кстати, на 29й минуте он рассказывает про jsonpath, а на 31й про ф-ю JSON_TABLE() оба нововведения выйдут в 11й версии 'jsonpath' -- позволяет указывать путь поиска внутри дерева. Крутой бафф индексов. JSON_TABLE() -- позволяет представить JSON-tree в виде таблицы. Делать с ней JOIN и т.д. Т.е. мы получим EAV через JSON. На-ко-нец-то. Вопрос - "а нах*й оно нам надо?", это отдельный вопрос. Искать по глубокому дереву всё ещё будет медленнее, чем в обычном EAV. Разве что только по верхней ветке будет более-менее быстро. Но с отдельными колонками думаю всё-равно не сравнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 23:27 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78, На самом деле JSONB действительно лучше, чем EAV, если не принимать во внимание такие недостатки как: крайне сильная зависимость от конкретной СУБД и даже от конкретной её версии, это значит, что для другой СУБД придётся переписать всё, в то время как EAV останется рабочим на стандартном диалекте SQL очень слабый контроль целостности со стороны БД Хранение структур данных в таблицах с возможностью поиска, индексации, и построения запросов это маст хев однозначно. Полноценное документное хранилище в реляционке, конец войнам и спорам. Но это не EAV, не является её альтернативой, и не решает задач так, как их решает EAV. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 23:46 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78Искать по глубокому дереву всё ещё будет медленнее, В третий раз - чтобы эмулировать EAV, никакие "глубокие деревья" в JSON не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 23:47 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ещё один недостаток типы, не надо рассказывать про десериализацию дат, десятичных числовых полей и прочее ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 23:48 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот Матроскинtip78Искать по глубокому дереву всё ещё будет медленнее, В третий раз - чтобы эмулировать EAV, никакие "глубокие деревья" в JSON не нужны. Нельзя эмулировать EAV, JSON-ом. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 23:49 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttВ этом весь смысл EAV, а не достоинство. Иначе нафига мне эти JSON с XML-ем упёрлись, если я просто могу создавать таблицы и налаживать между ними связи? Как обычно. Если считать "смыслом EAV" создание винегрета из данных и метаданных - то вполне возможно в этом ей нет конкуренции :) Но я как-то считал ее предназначением динамическую настройку атрибутов сущности. И эту задачу JSON/XML вполне решают, с лучшим нежели EAV контролем целостности. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2018, 23:52 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот МатроскинhVosttВ этом весь смысл EAV, а не достоинство. Иначе нафига мне эти JSON с XML-ем упёрлись, если я просто могу создавать таблицы и налаживать между ними связи? Как обычно. Если считать "смыслом EAV" создание винегрета из данных и метаданных - то вполне возможно в этом ей нет конкуренции :) Но я как-то считал ее предназначением динамическую настройку атрибутов сущности. И эту задачу JSON/XML вполне решают, с лучшим нежели EAV контролем целостности. Нет не решают. JSON хранит какие угодно данные, максимум что может обеспечить СУБД, это валидность JSON-а, но не содержание. В EAV мы ведём и схему и данные, и это контролируется БД. Если вести некий гибрид, типа EA-JSON (где V это JSON), то БД не будет гарантировать, что в JSON там не хранится какой-то полный бред, ну никак. А также не может запретить удалить атрибут при наличии значений. А также невозможно полноценное ведение значений -- ссылок. Это не + или -, это просто факты. Поэтому JSON это не EAV, это совершенно разные решения, которые не решают одно и ту же задачу, они решают разные задачи. Вы почему-то настойчиво пытаетесь проявить своё негативное отношение к модели данных, и поэтому делаете не верные выводы. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 00:00 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttJSON хранит какие угодно данные, максимум что может обеспечить СУБД, это валидность JSON-а, но не содержание. В EAV мы ведём и схему и данные, и это контролируется БД. Если вести некий гибрид, типа EA-JSON (где V это JSON), то БД не будет гарантировать, что в JSON там не хранится какой-то полный бред, ну никак. А также не может запретить удалить атрибут при наличии значений. А также невозможно полноценное ведение значений -- ссылок. Это не + или -, это просто факты. Не знаю как JSON, но содержимое XML-ей, их соответствие схеме и т.п. СУБД вполне умеет контролировать. Это просто факты :) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 00:14 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот МатроскинНе знаю как JSON, но содержимое XML-ей, их соответствие схеме и т.п. СУБД вполне умеет контролировать. Это просто факты :) Представим UI админки интернет-магазина. Заходит админ, открывает раздел "атрибуты товара", добавляет новый атрибут, допустим, «Цвет», указывает тип, сохраняет. В БД улетает обычный INSERT, который добавляет в схему новое поле. И он с этого момента начинает контролироваться БД. Можно и список всех атрибутов получить как обычный запрос, и каких-то левых Value засунуть не получится, только в рамках заданных атрибутов. Расскажите, как у вас это будет организовано на XML. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 00:22 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
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й может будет лучше. А может нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 03:58 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78и как это вам удалось собрать 2 этих утверждения в одном сообщении? ) Согласен, глупо получилось. Я хотел сказать, если вам надо хранить произвольные структуры данных, то JSON(B) лучше EAV. Т.е. это лучше вот этого Код: sql 1. 2.
tip78Я вот когда пробовал заменить свои задачи на JSONB в итоге плюнул. Ну вот и вы туда же Заменить задачи? В общем, мне к сказанному больше нечего добавить, всё довольно очевидно и понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 08:58 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
В БД улетает обычный INSERT, который добавляет в схему новое поле .Опечатка ? Новую запись ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 09:28 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttКот МатроскинНе знаю как JSON, но содержимое XML-ей, их соответствие схеме и т.п. СУБД вполне умеет контролировать. Это просто факты :) Представим UI админки интернет-магазина. Заходит админ, открывает раздел "атрибуты товара", добавляет новый атрибут, допустим, «Цвет», указывает тип, сохраняет. В БД улетает обычный INSERT, который добавляет в схему новое поле. И он с этого момента начинает контролироваться БД. Можно и список всех атрибутов получить как обычный запрос, и каких-то левых Value засунуть не получится, только в рамках заданных атрибутов. Расскажите, как у вас это будет организовано на XML. google "SQL Server xml schema collection". ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 09:35 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
L_argoВ БД улетает обычный INSERT, который добавляет в схему новое поле .Опечатка ? Новую запись ? Новый атрибут, поле с точки зрения динамической модели данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 10:47 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Кот Матроскинgoogle "SQL Server xml schema collection". Код добавление атрибута в студию. И удаления с зависимыми значениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 10:48 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttЯ хотел сказать, если вам надо хранить произвольные структуры данных, то JSON(B) лучше EAV. Т.е. это лучше вот этого Код: sql 1. 2.
а если надо отсортировать по attribute_name ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2018, 12:25 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttПомидорНу может в этой статье ничего не сказано как ограничить администратора системы который собственно и решает надо добавлять новое поле или нет, но большой разницы с eav не вижу. Да, в случае с eav это ограничение на основе внешних ключей на уровне базы данных, а в случае с жейсон эту же логику ограничений можно сделать на уровне приложения. Тогда postgres здесь как бы не упёрся, берём монгу или другое документо-ориентированное хранилище и привет. Суть именно EAV в сохранении ограничений целостности БД, хоть в какой-то мере. ПомидорСкажем администратор системы решил быть таким и таким полям, а модератор хочет обойти это решение, хочет добавить дополнительное поле, это очень легко решается как и в случае с eav моделем. Это бардак. Зачем монго когда эту задачу эффективно решает postgres? Я привел jsonb только для моделей которые требуют динамические аттрибуты (аналог eav), все остальное решается как обычно в рсубд. Что значит бардак? Разве не администратор интернет магазина решает что для конкретной категории товаров нужны определенные аттрибуты с указанием типа аттрибута, ограничением определенных значений которые она может принимать и так далее? Тоже самое можно сделать и для жейсона, но как я уже написал валидация данных в вашем случае будет ну уровне базы данных, а в моем случае на уровне приложения. Здесь почти разницы нету, обе могут решить задачи валидации данных. А вот когда надо будет запросы с фильтрацией, то жейсон уже вырывается вперед, а eav остается далеко позади, что и сказано в указанной мной статье. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 11:28 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttКот Матроскинпропущено... Какая задача, легко решаемая EAV, не может быть решена при помощи подхода с JSON/XML? Ну давайте посмотрим. Независимость от конкретных РСУБД. Ограничения целостности (не может быть значений отсутствующих атрибутов). Расширенный EAV мог бы вести типовые значения в отдельных таблицах или колонках, т.е. спектр типов, поддерживаемый БД шире JSON, даже в понятиях ANSI. Ну XML слишком жирный, хотя поддерживаемых примитивных типов больше. И "решена", имеется в виду средствами БД. Так как если сводить на уровень приложения, вообще всё можно решить, даже без БД )) Про какую независимость РСУБД вы имеете ввиду? Если хорошая фича реализована в одной системе, то скоро она станет стандартам. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 11:35 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78Кот Матроскин, а это что по-вашему? Код: sql 1. 2. 3. 4. 5.
Ваш запрос не очень понятен. Можете более развернуто написать задачу, его решение на примере eav, а я попробую написать запрос который также решит эту задачу применив жейсон модель. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 11:37 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttПомидорВ случае с постгерс ни не заставляет все поля кроме первичного ключа загонять в жейсон поле. Жейсон поле просто приятная возможность чтобы не плодить лишние сущности в базе, причем очень эффективная. Эффективная, но это не альтернатива EAV, в полной мере так сказать. Это другое. Например, со стороны приложения запихать каких-то полей, чудоковатых, при чём у каждой записи вообще свой набор полей. Или сохранить объектную структуру документа, да много чего. Но это не EAV. Чем же это не EAV? Что вы понимаете под EAV? Хорошо, давайте сперва определимся какую задачу решает EAV модель, как она контролирует целостность данных, проводит валидацию, как добавляются новый записи (новый аттрибут товара). И я приведу на жейсоне решение которая будет тоже самое делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 11:41 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttSERG1257пропущено... Это какие такие ограничения накладывает EAV? Нельзя создать значение для отсутствующего атрибута. Можно запретить удаление атрибута при наличии значений. Если создавать типовые колонки или таблицы значений, можно задать соответственно типовые ограничения, в том числе ссылки. Все это также решается на жейсоне. Если приведете пример котороя не решается на жейсоне, но вот так просто решается на eav модели, то буду рад исследовать эту задачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 11:45 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
eugene, Можно через связующие таблицы. авторКроме того желательно отразить в БД не одну а несколько классификаций, причем разных для каждого типа устройства. Можно будет к одной единице оборудования привязывать множество классификаций-типизаций ,каждая из которых в свою очередь связана со множеством классов и типов соответственно. Например как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 13:28 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Никакого EAV,XML,JSON не понадобится. Все индексирется и селектится дешево и сердито. Можно наложить всяких ограницений по уникальности комбинаций ключей. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 13:32 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорЗачем монго когда эту задачу эффективно решает postgres? Я привел jsonb только для моделей которые требуют динамические аттрибуты (аналог eav), все остальное решается как обычно в рсубд. Нет, не аналог EAV. Динамические атрибуты без схемы, это вообще любое хранилище, без схемы, хоть текстовые файлы. Таким макаром и обычный блокнот можно назвать аналогом чего угодно. ПомидорЧто значит бардак? Разве не администратор интернет магазина решает что для конкретной категории товаров нужны определенные аттрибуты с указанием типа аттрибута, ограничением определенных значений которые она может принимать и так далее? Тоже самое можно сделать и для жейсона, но как я уже написал валидация данных в вашем случае будет ну уровне базы данных, а в моем случае на уровне приложения. Речь идёт именно о СУБД. На уровне приложения я могу данные вообще хранить в key-value store и всё-всё-всё проверять на уровне приложения, или даже в текстовых файлах хранить. Аналог? Что за детский сад? ПомидорЗдесь почти разницы нету Ну так и все ограничения целостности, транзакции, и всё остальное делайте на уровне приложения. Зачем говорить вообще тогда о БД. Храните хоть всё в памяти, и сбрасывайте дамп на диск. Разницы ведь почти нет. ПомидорА вот когда надо будет запросы с фильтрацией, то жейсон уже вырывается вперед, а eav остается далеко позади, что и сказано в указанной мной статье. В указанной вами статье, SELECT по EAV с индексом быстрее, чем все вариации с JSONb. Обновление с индексом чуть-чуть медленнее. По собственному опыту, у нас есть внедрённая система на EAV, довольно крупная по мерками enterprise, и всё работает шустро. Что касается лучшей реализации, то делать проекции на классических таблицах, добавляя колонки динамически в таблицы, не оставляет вообще никаких шансов по скорости ни EAV, ни JSONb, если уж вас так интересует производительность. И, повторюсь, JSONB не явяется аналогом EAV. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 13:54 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорПро какую независимость РСУБД вы имеете ввиду? Если хорошая фича реализована в одной системе, то скоро она станет стандартам. ANSI SQL. Это будет работать сейчас в абсолютном большинстве СУБД. «Скоро» по-вашему, это когда? Когда для работы с JSON в пятёрке самых крупных БД будет одинаковый синтаксис запросов и набор операций? Лет через 10? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 13:56 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорЧем же это не EAV? Что вы понимаете под EAV? Хорошо, давайте сперва определимся какую задачу решает EAV модель, как она контролирует целостность данных, проводит валидацию, как добавляются новый записи (новый аттрибут товара). И я приведу на жейсоне решение которая будет тоже самое делать. Я уже давно жду вот такой пример: 1. Администратор интернет-магазина через UI приложения добавляет атрибут для товаров. 2. Администратор добавляет значения этого атрибута для некоторых товаров. 3. Администратор удаляет атрибут, значения атрибута удаляются. Для JSON(B) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 13:58 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttЧто касается лучшей реализации, то делать проекции на классических таблицах, добавляя колонки динамически в таблицы, не оставляет вообще никаких шансов по скорости ни EAV, ни JSONb, если уж вас так интересует производительность. разделить данные на постоянную часть (условно, таблица CLIENTS, на которую завязана бизнес-логика) и динамическую (условно, таблица CLIENTS_ADDITIONAL_FIELDS, на которую ничего не завязано) ? и подкладывать из отдельной таблицы какой-нибудь JSON/XML с доп.полями? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 14:32 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
читал эту тему , никуда там так и не пришли... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 14:35 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78разделить данные на постоянную часть (условно, таблица CLIENTS, на которую завязана бизнес-логика) и динамическую (условно, таблица CLIENTS_ADDITIONAL_FIELDS, на которую ничего не завязано) ? и подкладывать из отдельной таблицы какой-нибудь JSON/XML с доп.полями? Ну лично я имею в виду A+ES, все изменения данных через события, в РСУБД генерируются таблицы из событий. Но можно и ещё 50 разных способов и подходов расмотреть. Я бы не делил динамическую и статическую часть. Так как с развитием они начнут перемешиваться. То, что раньше казалось не важным и легко в динамику, легко может стать существенно важным, а переносить в статику, это довольно серьёзное изменение. И следить за двумя кусками одни и тех же данных (бизнес не различает «статику» и «динамику») -- усложнять жизнь в дальнейшем. Но это ИМХО. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 15:05 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78читал эту тему , никуда там так и не пришли... Хз насчёт темы, у нас в текущей систему динамически создаётся и ведётся системой 100% таблиц в РСУБД. И все счастливы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 15:05 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostttip78читал эту тему , никуда там так и не пришли... Хз насчёт темы, у нас в текущей систему динамически создаётся и ведётся системой 100% таблиц в РСУБД. И все счастливы. а пример можете показать? или ссылку мы сейчас говорим про саму архитектуру данных, или что за "динамические колонки" ? так то джойнами мы тоже получаем 100% динамические таблицы... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 15:26 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78а пример можете показать? или ссылку мы сейчас говорим про саму архитектуру данных, или что за "динамические колонки" ? так то джойнами мы тоже получаем 100% динамические таблицы... Вы попробуйте на EAV построить более-менее сложный копоративный отчёт, где присутствует не только фильтрация, но и группировки, подзапросы, drilldown, и т.д. К слову, на JSONB ситуация будет ещё печальнее, придётся городить кучу вьюх и поддерживать их, и это будет прибито намертво ржавыми гвоздями к конкретной СУБД и конкретной её версии. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 15:36 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostttip78а пример можете показать? или ссылку мы сейчас говорим про саму архитектуру данных, или что за "динамические колонки" ? так то джойнами мы тоже получаем 100% динамические таблицы... Вы попробуйте на EAV построить более-менее сложный копоративный отчёт, где присутствует не только фильтрация, но и группировки, подзапросы, drilldown, и т.д. К слову, на JSONB ситуация будет ещё печальнее, придётся городить кучу вьюх и поддерживать их, и это будет прибито намертво ржавыми гвоздями к конкретной СУБД и конкретной её версии. да есть у меня это всё в большинстве случае решается агрегацией в отдельной таблице в JSONB я бы никогда не стал этого делать вы про эту динамику чтоли? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 16:01 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78да есть у меня это всё в большинстве случае решается агрегацией в отдельной таблице в JSONB я бы никогда не стал этого делать вы про эту динамику чтоли? Наверное :) Если вы спрашиваете про архитектуру, мы раньше решали это классическим EAV, пробовали JSON и JSONB. И XML тоже пробовали. А потом пересели на CQRS+ES, и все эти костыли ушли в прошлое :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 16:18 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 16:51 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
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 в таблице Товары. Все это делается через транзакцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 17:09 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVostttip78да есть у меня это всё в большинстве случае решается агрегацией в отдельной таблице в JSONB я бы никогда не стал этого делать вы про эту динамику чтоли? Наверное :) Если вы спрашиваете про архитектуру, мы раньше решали это классическим EAV, пробовали JSON и JSONB. И XML тоже пробовали. А потом пересели на CQRS+ES, и все эти костыли ушли в прошлое :) если я правильно понял, CQRS + ES чем-то напоминает blockchain ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 17:41 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ну точно оно авторВот именно вопрос «производительности» мне и интересен. Потому что на простых примерах (когда за IO можно уследить глазками) всё всегда хорошо. Плохо начинается, когда запросы летят десятками тысяч в секунду. Обычная БД скрипит, но терпит. А если мы ведём журнал + head состояния? Пока всё хорошо, всё хорошо. А потом нам надо rebuild и мы стоим перед задачей перемолотить пол-года того, что в нормальном режиме грузило систему на 50%… ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2018, 18:17 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорСовершенно верно, все это аналоги, но все эти хранилища будут различаться по удобству, скорости, и т.д. Здесь я придерживаюсь варианта хранения динамических данных в жейсон поле. Вы пишете про схемы, давайте решать определенную задачу. В жейсоне я могу создать дополнительное поле 'validation_rules', в таблице справочнике Аттирибуты, и при добавление добавление, обновление этого поля, могу сделать валидацию. Как в EAV вы решаете эту задачу? В атрибут добавится поле validation_rules. Вы лучше расскажите, как вы сделаете поле FK в json. ПомидорЯ РСУБД использую как хранилище. Конечно обязательно пользуюсь возможностями целостности, правильности управления данными которые предоставляет РСУБД, но никто не отменял более сложные бизнес правила, которые притом еще динамические. И это не секрет никому, делаются на уровне сервера приложений. Что тогда меняет еще дополнительно проверять валидность данных на уровне приложения? Для очень загруженных систем как раз и применяют key-value store совместно с рсубд. Да при чём тут более сложные бизнес правила? Мы говорим про сравнение JSON и EAV, а не про весь спект всех задач, решаемых в мире. И я говорю, это не аналоги. А вы начинаете про какую-то сложную бизнес-логигу блаблабла. При чём тут это вообще? При чём тут ваши способы решения валидации? Если они не в БД? ПомидорВы кажется специально вводите, запутываете, собираете все в кучу. Транзакции как раз делаются на уровне БД. А вот читать данные можно и с памяти, чем и занимается редис например. Это вы всё в кучу собираете. Я как раз пытаюсь стряхнуть пыль. То, что вы можете сохранить в поле JSON что угодно, не делает его аналогом EAV, что тут непонятного? ПомидорВ указанной мной статье нигде не указанно что бы утверждаете. Жейсон везде выигрывает. Со всеми приседаниями, которые требуется сделать, чтобы JSON выигрывал у EAV, оно не нужно и задаром. И уж если вернуться к тебе разговора, что JSON это не аналог EAV, я уже озвучил почему, такие сравнения выглядят довольно смешными. Хотите хранить в БД какой-то структурированный мусор с точки зрения БД, и управлять этим со стороны приложения, пожалуйста, используйте JSONB, можно даже в обычное текстовое поле запихивать JSON и это будет работать вообще на всех БД. Но это не EAV. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 03:26 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорТаблица Аттрибутивы: 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 03:30 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
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.Смешными выглядят ваши попытки уйти от темы, заниматься тафтологией. Это не попытка оскорбить вас, и заранее извиняюсь. Просто я понимаю что вы хотите сказать, но я хочу вам немного другое объяснить. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 04:17 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttЯ не вижу, где здесь СУБД контролирует целостность. Не даёт создать значение отсутствующего атрибута. Или удаляет все значения удалённого атрибута, или наоборот, запрещает удалить атрибут, если у него имеются значения. EAV это делает. С JSONB никакого контроля со стороны БД нет. А все потому что. JSON/B/XML это не аналог EAV. Ну я так сразу же писал что целостность контролируется на стороне приложения. Как можно удалить значения которые запрещены к удалению? На уровне приложения для этого делаются всякие тесты чтобы проконтролировать такие казусы, и это намного гибче. Ведь даже в случае с EAV вам иногда надо удалить запись с каскадным эфектом. Вы можете ошибиться приняв такое решение? Можете. И БД никак не поможет вам в этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 04:25 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорИ как этот поле validation_rules будет помогать БД контролировать целостность, коректность данных? Не таким же образом который я написал? Точно таким же, как и для JSON. Какие-нибудь бизнес-ограничения на уровне приложения. Для ограничений целостности: по типу данных, по наличию атрибута, foreign key, будет проверка на уровне СУБД. И всего этого не будет на уровне СУБД для JSON. ПомидорВообще то я сразу же написал на каком уровне обеспечивается целостность данных в случае EAV и в случае жейсон. А задачу динамического атрибута решают оба и жейсон выигрывает. Вы сравниваете мяч и апельсин только на том основании, что они круглые. Спор зашёл в тупик. ПомидорНепонятно то, что если я используя жейсон поле достигаю того же эфекта как при eav, приэтом выигрываю во многом, и предлагаю использовать этот метод, а вы цепились за какие то мифический контроль целостности данных со стороны БД. Потому что целостность данных это не только обязательное присутствие каких то данных, но еще их коректность. И эту коректность вы полюбому будете делать на стороне приложения (на дворе 2018 год :) ) а не в БД. Какая можеть КОРРЕКТНОСТЬ у непонятного значения в JSON с именем "хер_знает_что"? Вы чего городите? В EAV вы тупо не создадите значение для отсутствующего атрибута. И не сможете просто так грохнуть атрибут, если повесить NO ACTION в ограничениях целостности. Я не против, если вы выбрали управлять корректностью полностью на строке приложения, ок. Спор не об этом. Выбрали, обосновали свой выбор -- ну и прекрасно. Но с точки зрения хранения данных в СУБД это не одно и то же. Это не "аналоги", как часто это может звучать вследствие банальной неграмотности. ПомидорВы признаете что жейсон выиграл спор скорости? Или оно вам до сих пор и задаром не нужно? Нет, не признаю. На конкретном примере, крайне упрощённом и далёком от реальности, цифры не являются окончательным показателем. Что будет в разрезе отчётов с группировкой и подзапросами, на большом объёме данных? Что будет, если некоторые атрибуты меняются часта, а некоторые нет? Что будет, если для каждого значения атрибута нужно добавить ведение истории? Все эти задачи решаются на EAV в одинаковом ключе, для JSON от задачи придётся сильно менять и подходы и модель данных, что-то тащить в реляционку, что-то хранить в "куче". ПомидорСмешными выглядят ваши попытки уйти от темы, заниматься тафтологией. Это не попытка оскорбить вас, и заранее извиняюсь. Просто я понимаю что вы хотите сказать, но я хочу вам немного другое объяснить. Нет, не тафталогия. Когда говорят, что JSON это альтернатива EAV, это банальное распостранение заблуждений. И разные задачи решаются лучше разными способами. Не является ни в какой мере, утверждение, что "лучше будет, если EAV заменить JSON". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 09:33 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорНу я так сразу же писал что целостность контролируется на стороне приложения. Как можно удалить значения которые запрещены к удалению? На уровне приложения для этого делаются всякие тесты чтобы проконтролировать такие казусы, и это намного гибче. Ведь даже в случае с EAV вам иногда надо удалить запись с каскадным эфектом. Вы можете ошибиться приняв такое решение? Можете. И БД никак не поможет вам в этом. В EAV отлично работает каскад. Странно, что когда мы говорим о БД, вы смещаете фокус внимания на приложение. В таком случае, я повторюсь, совершенно пофигу что и как и где вы будете хранить, если всем будет управлять приложение. На самом деле, я только приветствую и всячески поддерживаю, когда логика размещена в приложении, а не в СУБД. Но осуществлять базовые ограничения целостности именно модели размещения данных, таки задача СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 09:36 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
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".Хорошо, не жейсон, ведь это только формат данных, а метод на основе его, если для вас это будет более понятным. Хотя я изначально это и имел ввиду, как и автор статьи. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 11:16 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
hVosttПомидорНу я так сразу же писал что целостность контролируется на стороне приложения. Как можно удалить значения которые запрещены к удалению? На уровне приложения для этого делаются всякие тесты чтобы проконтролировать такие казусы, и это намного гибче. Ведь даже в случае с EAV вам иногда надо удалить запись с каскадным эфектом. Вы можете ошибиться приняв такое решение? Можете. И БД никак не поможет вам в этом. В EAV отлично работает каскад. Странно, что когда мы говорим о БД, вы смещаете фокус внимания на приложение. В таком случае, я повторюсь, совершенно пофигу что и как и где вы будете хранить, если всем будет управлять приложение. На самом деле, я только приветствую и всячески поддерживаю, когда логика размещена в приложении, а не в СУБД. Но осуществлять базовые ограничения целостности именно модели размещения данных, таки задача СУБД. Так что мешает на жейсоне сделать каскад? Также отлично будет работать. Где хранить будет непофигу с точки зрения удобства, скорости, модификаций каких то. Поэтому рекомендую постгис где возможно как реляционка так и документо-ориентированность. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 11:23 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорВот и выяснили что полюбому вам придеться проверять данные на уровне приложения. А теперь чтобы по типу данных была целостность, вам надо еще немного потрудиться чем простое 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.
буков больше? Такие запросы также могут генериться приложением, никто руками их не пишет. История на колоноки здесь бесплатно. Возможность конвертить тип, не теряя данных бесплатно. Делать быструю "колоночную" аналитику бесплатно. Хранить к дополнительные данные к каждому значению бесплатно (на JSON вместо значения придётся делать структуру вместо примитива, а это увеличит сложность запросов просто драматически). Быстрое обновление, проставить значения атрибута хоть для +100500 сущностей без проблем. Контроль со стороны БД. Настоящие ФК в значениях атрибутов. Расширение вширь и в глубь, без изменения существующего кода. Ну и конечно, сильная независимость от вендора, для кого-то это фигня, кто сидит пожизненно плотнячком на конкретной субд. Для нас, например, это важно, и это окупилось уже многократно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 12:03 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорТак что мешает на жейсоне сделать каскад? Также отлично будет работать. Где хранить будет непофигу с точки зрения удобства, скорости, модификаций каких то. Поэтому рекомендую постгис где возможно как реляционка так и документо-ориентированность. :) Какой каскад, со стороны аппликейшен? Ну это даже не смешно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 12:03 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
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.
Напишите аналог этого запроса на модели EAV. Тем более я могу через приложение гибко контролировать select часть, а в EAV? У вас там запрос полностью измениться. Историю я веду не на колонки, а на строки. Занимает много места, но сейчас это уже не проблема. Зато позволяет сразу вытаскивать нужную информацию не применяя жойны. Код: sql 1. 2. 3. 4. 5.
буков больше? Такие запросы также могут генериться приложением, никто руками их не пишет. История на колоноки здесь бесплатно. Возможность конвертить тип, не теряя данных бесплатно. Делать быструю "колоночную" аналитику бесплатно. Хранить к дополнительные данные к каждому значению бесплатно (на 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 быстрее. :) Расширение вширь и в глубь жейсон метод не ограничивает ни как. Сильная зависимость от вендора для меня действительно не проблема на данный момент. Выбираю инструменты сам. Но вашу точку зрению я изначально понимал. Просто думаю скоро все вендоры реализуют такие фичи в любом случае. Если не секрет то с какой субд на какую субд вы прыгнули? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 13:24 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорКак БД контролирует данные которые должны соответствовать схеме? Например хотим в динамическом атрибуте хранить период даты, как она это проконтролирует? ну для начала можно на колонку повесить тип date, и тогда кроме даты туда уже ничего не вставить "динамический атрибут периода даты" это started + closed потом есть CONSTRAINTS , можно проверять, чтобы дата была в диапазоне, чтобы была уникальной, чтобы не пересекалась с другими таблицами (FK) ничего из этого JSONB не умеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 16:08 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78ПомидорКак БД контролирует данные которые должны соответствовать схеме? Например хотим в динамическом атрибуте хранить период даты, как она это проконтролирует? ну для начала можно на колонку повесить тип date, и тогда кроме даты туда уже ничего не вставить "динамический атрибут периода даты" это started + closed потом есть CONSTRAINTS , можно проверять, чтобы дата была в диапазоне, чтобы была уникальной, чтобы не пересекалась с другими таблицами (FK) ничего из этого JSONB не умеет. Сделайте все это в EAV модели. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 16:40 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
сделано уже многократно этот функционал доступен из коробки ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 18:09 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
вы даже не умеет создавать колонки с типом date? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 18:10 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
tip78вы даже не умеет создавать колонки с типом date? Ваш поверхностный пример оставляет очень много вопросов, и у меня есть сомнения что у вас получиться это сделать именно с моделью EAV. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 19:34 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
что не получится? дату создать? check повесить? FK прописать? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 21:26 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
напишите что-то посерьёзнее парсера, типа CRM многопользовательской (а лучше 3), всё будет получаться ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2018, 21:36 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
ПомидорКак БД контролирует данные которые должны соответствовать схеме? Например хотим в динамическом атрибуте хранить период даты, как она это проконтролирует? Вариантов несколько, от разных таблиц для каждого типа, до одной таблицы с разными полями. Так или иначе, в поле типа 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, просто надо понимать, что это структура по сути куча. Надо всегда это понимать, и работать с ней соответствующим образом. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2018, 01:30 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
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, просто надо понимать, что это структура по сути куча. Надо всегда это понимать, и работать с ней соответствующим образом. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2018, 06:34 |
|
Пронетирование бд электроэнергетических устройств
|
|||
---|---|---|---|
#18+
Прошлое сообщение было по ошибке отправлено. Не могу отредактировать. Поэтому это новое. 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, просто надо понимать, что это структура по сути куча. Надо всегда это понимать, и работать с ней соответствующим образом. Это понимание есть. И как это использовать тоже понимания есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2018, 07:07 |
|
|
start [/forum/topic.php?all=1&fid=32&tid=1540020]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
108ms |
get tp. blocked users: |
2ms |
others: | 239ms |
total: | 438ms |
0 / 0 |