LINUX.ORG.RU

Его крокейшество о вредности СУБД, если архитектурно она для программ, а не живого человека

 ,


0

6

Давно уже что-то про Столярова Croco ничего не было =) А тут он повод недавно дал, расписав почему считает недопустимым использовать СУБД в архитектуре при проектировании софта. То есть, если для каких-то программ нужно хранение данных, его надо индивидуально под программу делать, а не подключать базы данных.

Можно обсудить. В принципе я сам не люблю для локальных данных применять базы данных, часто достаточно просто текстовых файлов и это даже надежно и быстро. Но в целом каким-то луддизмом отдает. Его сообщение ниже:

http://www.stolyarov.info/guestbook#cmt97

==============

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

Причины можно назвать, например, такие:

  1. СУБД — это лишняя внешняя зависимость, при том что вообще любые внешние зависимости суть хамство в отношении пользователей и мейнтейнеров;
  2. СУБД требует трудозатрат на установку, настройку и дальнейшее администрирование;
  3. СУБД способна упасть (и да, падает намного чаще, чем, скажем, тот же апач — вообще пока мои сайты жили на «традиционной» CMSке, именно СУБД была причиной всех случаев downtime моих сайтов, за исключением одного, когда на сервере физически осыпался жёсткий диск);
  4. СУБД требует от пользователя постоянно обновлять навыки, которые, возможно, больше ни для чего не нужны;
  5. СУБД хранит информацию пользователя в неочевидном для него виде; этим грешат не только СУБД, конечно, но СУБД мало того что хранят всё в бинарных файлах, которые без самой СУБД даже думать нечего разобрать, они ещё и вводят дополнительный слой хаотизации в виде схемы БД, провоцируя разработчиков софта на внедрение «решений», единственное «описание» которых остаётся в голове у автора;
  6. СУБД требует изрядных вычислительных мощностей и крадёт (а вовсе не повышает, как почему-то многие уверены) производительность.

Я, заметим, не рискну утверждать, что СУБД как сущность вообще никогда не может ни для чего применяться. Тут вопрос в том, кто на ком стоял: если главной целью является база данных как таковая, то есть вот имеется какой-то значительный объём разнородной, но при этом взаимосвязанной информации и стоит задача обеспечить его хранение и в нём поиск, причём никто заранее не знает, какие именно задачи будут решаться на этом массиве информации, какие именно поисковые запросы будут делаться и вот это вот всё, то да, СУБД вполне может оказаться адекватным решением, и даже для работы с ней могут создаваться вспомогательные программки. Это, конечно, не оправдывает существования языка SQL, который в любых его проявлениях представляет собой надругательство над здравым смыслом, но в целом СУБД как вид софта существовать, наверное, всё-таки может — но лишь в случаях, когда либо вообще нет никаких программ кроме неё самой, либо программы делаются для неё, а не она сама поддерживается для работы какой-то программы.

Всё это можно выразить и короче: СУБД, по-видимому, вполне имеет право на существование в ситуации, когда основным способом работы с ней будет непосредственное вбивание запросов на её языке запросов живым человеком. То есть когда именно вот это — основное, а всё остальное вспомогательное. В подавляющем большинстве случаев мы видим прямо противоположное: с СУБД как-то там общается некая программа (намного реже — больше одной программы, и это уже пограничный случай), а живой человек делает запросы либо только в рамках обслуживания всей системы, либо вообще никогда.

Когда же пишется некая программа, предполагающая применение для конкретных задач (а программы иначе, собственно, и не пишутся), и данные возникают исходя из этих задач, а не наоборот, то за саму идею задействования внешней СУБД нужно убивать на месте. Сугубо из санитарных соображений.

★★★★★
Ответ на: комментарий от firkax

Эм, нет. Конкурентный доступ к данным как раз реализуется за 5 минут своим кодом.

Вообще-то поддержание транзакционной целостности данных при одновременном доступе к ним - это чуть ли не самая сложная часть у СУБД.

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

praseodim ★★★★★
() автор топика
Ответ на: комментарий от firkax

Я даже не сомневался, что ты опять будешь нести чушь.

Значимых преимущества СУБД ровно эти два, и оба они относятся исключительно к ускорению разработки.

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

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

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 2)
Ответ на: комментарий от liksys

Я даже не сомневался, что ты опять будешь нести чушь.

Да нет, чушь несёшь ты, как всегда.

А еще, поддержка самописного решения банально дороже в сопровождении.

Это и есть скорость разработки. Кто-то потратил и оплатил 10 часов разработки, а кто-то 100.

Всё всегда сводится к скорости, вопрос в промежуточных и последующих проблемах.

Нет, не всё. Да и скорость разная бывает - скорость разработки это одно, скорость работы - уже другое, и оно обычно важнее (в некоторых рамках).

firkax ★★★★★
()
Ответ на: комментарий от firkax

Да нет, чушь несёшь ты, как всегда.

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

Это и есть скорость разработки. Кто-то потратил и оплатил 10 часов разработки, а кто-то 100.

Нет. Помимо часов, есть еще уровень квалификации сотрудника, от которого зарплата всё так же зависит. Сто часов джуна не равно десяти часам сеньера. После завершения основной разработки последует период сопровождения, в котором стоимость будет в прямой зависимости от количества велосипедов и качества изначального кода.

Ты о коммерческой разработке не слышал, поэтому вот, делюсь опытом. Учись, студент, мотай на ус.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от kaldeon

То не оскорбление, просто констатация факта. Для меня вообще оскорблением не является то что никак не характеризует мою личность то есть какие-то неверные суждения. Я просто знаю что я лучше остальных, и что крысы говорят за спиной кисы меня мало волнует… А у Столярова вообще мания величия ему срать скорее всего вдвойне

rtxtxtrx ★★★
()
Ответ на: комментарий от firkax

Опыт идиотов мне не нужен, делись в другом месте.

Ты вместо того, чтобы дерзить, лучше бы молчал и внимал, пламенный юноша. Сошел бы за умного. А так - как обычно, только чувственные выпады и оскорбления. Ничего нового.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 4)
Ответ на: комментарий от vbr

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

Я давно наблюдаю за тем, что он и ему пишут и пришел к кое-каким выводам. Андрей Викторович может признать свою неправоту, но только по каким-то частным вопросам. Опечатка в книге, даже баг в программе, может не знать какой-то функции в DE и признать это, спросить как что-то сделать даже может.

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

Например, он решил, что все «комитетское» в ЯП - уродство, не имеющее права на существование и бесполезно ему доказывать, что C99 и новее, также как и C++98 и новее имеют не только сомнительные моменты, но полезные фичи.

Решил, что мощные компьютеры не нужны и условно всем, кому не нужен вычислительный центр, должно хватать древнего одноядерного нетбука - и бесполезно доказывать, что мощность современных компов объективно есть куда потратить.

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

praseodim ★★★★★
() автор топика
Ответ на: комментарий от vbr

В любом смартфоне десятки sqlite баз данных, работа с которыми ведётся через тот самый SQL. Найти динамический веб-сайт без СУБД - это постараться надо.

Вот ты и привёл аргументы в пользу позиции Столярова.

spqr ★★★
()
Ответ на: комментарий от praseodim

Вообще-то поддержание транзакционной целостности данных при одновременном доступе к ним - это чуть ли не самая сложная часть у СУБД.

Потому что эту целостность надо поддерживать для произвольного кода пользователя.

Если известно, как твои данные в твоей программе используются, то конкурентный доступ делается намного эффективнее, чем его можно сделать на СУБД. Например, упомянутый выше пример журнала событий, к которому должен быть конкурентный доступ множества читателей (с разными сложными запросами) и одновременно одного писателя новых событий. На файле тривиально, на SQLite программисты 1С не осилили. Или кольцевой буфер: в ядре линукса он даже безблокировочный. На таблице SQL СУБД сделать аналог почти нереально.

monk ★★★★★
()
Ответ на: комментарий от liksys

А еще, поддержка самописного решения банально дороже в сопровождении.

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

Не думаю, что сопровождать Erlang + Mnesia дороже, чем Erlang + epgsql + Postgres. А если ещё и добавить требование распределённости БД, то сопровождение Postgres уже станет гораздо дороже.

monk ★★★★★
()
Ответ на: комментарий от monk

Не думаю, что сопровождать Erlang + Mnesia дороже, чем Erlang + epgsql + Postgres.

Это не имеет отношения к теме. Использование мнезии уже само по себе не является велосипедостроением, как и использование какого-нибудь зукипера.

Пациенты велосипедостроительного диспансера обсуждали в первую очередь случай Erlang vs Erlang + Mnesia vs Erlang + epgsql + Postgres.

liksys ★★★★
()
Ответ на: комментарий от liksys

Это не имеет отношения к теме. Использование мнезии уже само по себе не является велосипедостроением, как и использование какого-нибудь зукипера.

Столяров разве призывает полностью отказаться от библиотек? Вроде только от СУБД.

Пациенты велосипедостроительного диспансера обсуждали в первую очередь случай Erlang vs Erlang + Mnesia vs Erlang + epgsql + Postgres.

А я продвигаю свою точку зрения. Что SQL СУБД почти всегда являются злом и вместо них надо использовать средства, предоставляемые языком программирования (разумеется, с учётом библиотек). Исключение: неизвестные заранее запросы и ACID. Но в этом случае лучше дать пользователю доступ к SQL, чем писать прослойку, предоставляющую пользователю ограниченное подмножество этого SQL.

monk ★★★★★
()
Ответ на: комментарий от monk

Столяров разве призывает полностью отказаться от библиотек? Вроде только от СУБД.

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

Что SQL СУБД почти всегда являются злом

СУБД решают огромное количество типовых проблем. Если они есть в твоем проекте - берешь СУБД и не мучаешься. Если именно для тебя СУБД являются злом, то это значит, что у тебя просто перекос в сторону таких задач (или некоторая предвзятость).

liksys ★★★★
()
Ответ на: комментарий от monk

Что SQL СУБД почти всегда являются злом и вместо них надо использовать средства, предоставляемые языком программирования

Я не понимаю в какой реальности вы живёте, если почти весь интернет работает на SQL СУБД, включая этот сайт.

X512 ★★★★★
()
Ответ на: комментарий от X512

Я не понимаю в какой реальности вы живёте, если почти весь интернет работает на SQL СУБД, включая этот сайт.

Также как весь почти весь мир пользуется Windows, включая многих пользователей этого сайта. SQL СУБД как и Windows это «привычное решение». Такое решение имеет недостатки перед правильным, но когда лень выбирать и в принципе неважно качество результата, а просто нужен какой-то результат (где-то хранить данные в случае СУБД и как-то работать на компьютере в случае Windows), то выбирается именно привычное.

monk ★★★★★
()
Ответ на: комментарий от liksys

СУБД решают огромное количество типовых проблем. Если они есть в твоем проекте - берешь СУБД и не мучаешься.

С этим согласен. Беда в том, что СУБД берут просто по умолчанию почти всегда, когда надо хранить какие-то данные.

Также как с выбором ОС/графического интерфейса/протокола передачи/формата данных. Windows/Electron/HTTP/JSON берут не потому, что они лучше подходят под задачу, а потому что это первое, что приходит в голову.

monk ★★★★★
()
Ответ на: комментарий от monk

CУБД это менеджер(внешней)памяти

забавная загагулина что современные «учебники» sql|nosql редко когда ныряют дальше индексов

нормальные учебники по базам данных же тщательно разбирают несколько частей:

структуры хранения данных - всякие B&*(^%&$ деревья; различные индексы и методы кеширования вот этого всего для увеличение производительности

методы доступа — sql тут важная веха ибо унификация и инкапсуляция(не полная :( ) предыдущих структур

вопросы транзакций и распределённости и прочей хурмы маштабирования(вертикальной; горизонтальной и наискосок)

и да субд это частный случай ос&фс

в целом слой sql оказывается излишним если клиентское приложение может себе позволить копошится с api структур хранения данных

тока вопрос - а в каких областях это лучшее roi чем общепринятое взаимодействие через sql :)

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

лучшее roi

К roi технологии вообще почти перпендикулярны. Там маркетинг рулит. Oracle разрекламировал SQL, приложение с SQL стало автоматически больше цениться в глазах пользователя (даже если тормозило как 1С 7.7 SQL). Сейчас рекламируют микросервисы, приложение с микросервисами ценится больше. Начнут рекламировать хранение в облаке и поиск через запросы к ИИ, будут хранить для большего roi так.

monk ★★★★★
()
Ответ на: комментарий от Chiffchaff

Киньте кто нибудь ссылкой на эту статью, если есть.

cdtemp
()
Ответ на: комментарий от monk

Windows/Electron/HTTP/JSON

Смешались в кучу кони, люди.

Windows берут тогда, когда есть определенная аудитория, для которой предназначен продукт.

Электрон берут тогда, когда в компании много жаваскриптеров, ради экономии или легкой кроссплатформенности.

HTTP/JSON берут тогда, когда есть хотя бы небольшая вероятность коммуникации с браузером, даже в случае отладки.

Ты просто ищешь удобные примеры для подтверждения своей манятеории, а факт же в том, что большинство решаемых в айти задач - вполне типовые, и типовая БД под них подходит просто идеально.

liksys ★★★★
()
Ответ на: комментарий от liksys

Электрон берут тогда, когда в компании много жаваскриптеров, ради экономии или легкой кроссплатформенности.

Это настолько же верно, как то, что SQL берут тогда, когда в компании много DBA и SQL-программистов. Ради экономии или легкой кроссплатформенности.

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

Для тех задач уже есть типовые библиотеки, использующие СУБД. А вот когда выбирают решение с СУБД для новой задачи, это часто аналог «выбору» Windows/Electron в качестве интерфейса и микросервисов с обменом JSON по HTTP в качестве движка для управления списком просмотренных фильмов (который, конечно же, хранится в СУБД).

monk ★★★★★
()
Ответ на: комментарий от monk

Ради экономии или легкой кроссплатформенности.

Точно-точно? Когда требуются SQL-разработчики, никакой кроссплатформенности уже не будет. Подумай сам, почему.

Для тех задач уже есть типовые библиотеки, использующие СУБД.

И мы всё равно возвращаемся к использованию СУБД.

это часто аналог «выбору»

Нет. Просто задача хранения данных всяких околосайтов и коммерсов очень типовая, и для большинства подходят таблицы.

движка для управления списком просмотренных фильмов (который, конечно же, хранится в СУБД)

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

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 3)
Ответ на: комментарий от liksys

Точно-точно? Когда требуются SQL-разработчики, никакой кроссплатформенности уже не будет. Подумай сам, почему.

Почему не будет? Можно будет перенести с С# на Windows на Swift на MacOS и оставить неизменным весь код вокруг патченого PostgreSQL 17.

И мы всё равно возвращаемся к использованию СУБД.

Это не выбор СУБД для задачи, это выбор типового решения.

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

Ага. Когда-то бездумно выбирали весь набор LAMP: Linux+Apache+MySQL+Perl. Ибо «для большинства подходят».

Это буквально один из лучших примеров использования СУБД по назначению.

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

Но бездумно это «один из лучших примеров использования СУБД по назначению», потому что список каких-то данных есть, поля у данных есть, какая-то работа с данными есть.

monk ★★★★★
()
Ответ на: комментарий от monk

Почему не будет?

Потому что смотря что взять за плафторму. Я думал, что ты имел в виду переносимость между разными SQL.

Это не выбор СУБД для задачи, это выбор типового решения.

Типовой задаче - типовое решение.

Ага. Когда-то бездумно выбирали весь набор LAMP: Linux+Apache+MySQL+Perl. Ибо «для большинства подходят».

Не передергивай.

обкарнывать под структуру СУБД?

Обкарнывать ничего не надо. Список фильмов идеально ложится на структуру бд. Надо локальное - берешь SQLite и получаешь бесплатное управление структурой и поиск. Надо сетевое - берешь любую базу под требования.

Но бездумно это «один из лучших примеров использования СУБД по назначению»,

Не бездумно, а вполне осознанно, просто тебе это не нравится из-за каких-то твоих религиозных верований. Не бывает задач найти идеальное решение. Есть задачи найти решение, подходящее под технические требования с учетом стоимости реализации и будущей эксплуатации.

Гугл когда-то купил сервис авиабилетов, написанный на лиспе. Наверняка лисп подходил идеально, и лисперы это продавали как победу лиспа над всем остальным. Вот только оказалось, что сложность и стоимость поддержки этого скобчатого говна невероятная, и поэтому в гугле его просто кусками переписали на более типовом, но дешевом C++.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от liksys

Потому что смотря что взять за плафторму. Я думал, что ты имел в виду переносимость между разными SQL.

Так в случае Электрона ты же не имеешь в виду переносимость между разными тулкитами.

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

Нет. Для полей «список тегов» (список элементов, выбираемых из списка), «описание фильма» (с поиском по ключевым словам), «жанр» (с выбором из списка или произвольной строкой), «студия» (с выбором из списка или строкой), «находится» (список ссылок с разной структурой, поля которой настраиваются пользователем: сайт, адрес кинотеатра, …) прямого соответствия в типах SQL нет.

Есть непрямое. «Тэги» будут через дополнительную таблицу многие-ко-многим. «Студия» будет двумя полями. «Находится» будет ограничено только строковыми значениями полей или храниться в JSON и обрабатываться вне SQL.

А без СУБД на объекты Java или даже питона всё это ложится идеально без костылей.

подходящее под технические требования с учетом стоимости реализации и будущей эксплуатации.

Мы всё ещё про однопользовательскую программу, не требующую администрирования. Какая стоимость эксплуатации?

И реализовать всё на питоне с хранением в pyckle будет гораздо быстрее, чем даже просто спроектировать схему SQL, чтобы ограничения SQL не слишком ломали изначальную задачу.

monk ★★★★★
()
Ответ на: комментарий от monk

Так в случае Электрона ты же не имеешь в виду переносимость между разными тулкитами.

DBA-программисты десктопный софт не пишут, поэтому я перешел на обсуждение переносимости другого уровня.

Нет.

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

Есть непрямое.

Самое прямое.

А без СУБД на объекты Java или даже питона всё это ложится идеально без костылей.

В объектах жавы и питона нет типа «жанр фильма». Его точно так же надо определить, как и в БД, с поправкой на семантику.

Мы всё ещё про однопользовательскую программу, не требующую администрирования. Какая стоимость эксплуатации?

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

И реализовать всё на питоне с хранением в pyckle будет гораздо быстрее

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

Я понял твою логику: наговнякать поскорее - и нормально. Проектирование для слабаков. Та же столяровщина, яйца в профиль.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от liksys

DBA-программисты десктопный софт не пишут

Жаваскриптеры тоже.

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

Текстовыми полями, это ссылку на жанр делать по имени жанра? А если в имени жанра опечатка, то при его изменении дополнительно по таблице фильмов подмену делать?

А адрес кинотеатра как в строку запихнёшь? Чтобы потом можно было найти какие фильмы в этом же городе показываются?

В объектах жавы и питона нет типа «жанр фильма».

В питоне в поле не требуется ограничивать тип

movie1.genre = genres.drama;
movie2.genre = "что-то непонятное, но интересное"

В Java жанр будет структурой с двумя полями.

man реляционная теория баз данных.

Так я именно про неё. Значением поля может быть только атомарное значение заранее заданного типа. Типы определяются конкретной СУБД. Что обрезает доступные сериализуемые типы до тех, с которыми СУБД умеет работать.

Кстати, как на SQL СУБД написать

[m for m in movies if m.tags & include  == include and m.tags & exclude == set()]

То есть выбрать все фильмы, у которых есть все тэги из множества include и нет ни одного из множества exclude?

Или предложишь мне чужой пикл исполнять?

А в чём принципиальная разница, исполнять чужую программу с импортом чего-то или чужой пикл?

А если это именно отдельная нужная функция, то реализовать экспорт и импорт. Если взять вместо пикла JSON, то тоже почти тривиально. А JSON уже не исполняется.

Я понял твою логику: наговнякать поскорее - и нормально.

Это ты критерием скорость разработки поставил.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от vbr

Вспоминается:

"6. JOIN это зло -они медленные

Вытягиваем в контроллер две таблицы из базы

Джойним их средствами нашего любимого языка программирования

Добавляем выбор алгоритма - nested loop, hash, merge и получаем самодельную базу данных, только плохую. "

Paka_RD
()
Последнее исправление: Paka_RD (всего исправлений: 1)
Ответ на: комментарий от Paka_RD

Добавляем выбор алгоритма - nested loop, hash, merge и получаем самодельную базу данных, только плохую.

В языке программирования вместо JOIN почти всегда атомарное чтение поля. А в SQL базе данных написать WHERE movie.theater.city = "Москва" нельзя, надо делать JOIN, который в лучшем случае hash, а обычно медленнее.

monk ★★★★★
()
Ответ на: комментарий от Paka_RD

Джойним их средствами нашего любимого языка программирования

Вот запрос. tags - поле в таблице movies со списком тегов. Надо получить список записей, для которых есть все теги из списка include и ни одного из списка exclude

На языке программирования это тривиально:

[m for m in movies if m.tags & include  == include and m.tags & exclude == set()]

Как это сделать в SQL и во сколько раз медленнее оно будет работать?

monk ★★★★★
()
Ответ на: комментарий от monk

Приходит в голову только вариант типа

for i in include:
  if s != "":
    s = s + " INTERSECT "
  s = s + "SELECT DISTINCT movie_id FROM movies_tags WHERE tag_id = " + escape(i)

sql = "SELECT * FROM movies WHERE id IN (" + s + ") AND NOT id IN (SELECT movie_id FROM movies_tags WHERE tag_id IN (" + escape(exclude) + "))"

Но это определённо будет жутко медленно и иметь линейную сложность относительно длины include.

monk ★★★★★
()
Ответ на: комментарий от monk

exclude понятно, как include проверять?

Если бы вы меня спросили наоборот то я бы вам сказал NOT IN.

Но ваш вопрос ставит меня в тупик, я вас не понимаю.

mx__ ★★★★★
()
Ответ на: комментарий от mx__
SELECT * FROM movies WHERE id IN (SELECT movie_id FROM movies_tags WHERE tag_id IN &include))

выдаст фильмы, где хотя бы один тег в include. Как сделать запрос, чтобы выдало фильмы, где все теги есть в include?

monk ★★★★★
()
Ответ на: комментарий от monk

где все теги есть в include?

А все сразу … с ходу не скажу.

mx__ ★★★★★
()
Ответ на: комментарий от monk

На питоне (и почти любом другом ЯП) тривиально

[m for m in movies if m.tags & include  == include and m.tags & exclude == set()]
monk ★★★★★
()
Ответ на: комментарий от monk

SELECT * FROM movies WHERE tags LIKE include AND tags NOT IN (exclude)

mx__ ★★★★★
()
Ответ на: комментарий от monk

Извините запутался, я думал у вас tags список тегов к этому фильму.

tags - поле в таблице movies со списком тегов.

mx__ ★★★★★
()
Последнее исправление: mx__ (всего исправлений: 1)
Ответ на: комментарий от monk

Решение условия на include «в лоб»:

У таблички include сделать вычисляемый столбик count(1) over() as Q_inc. Сджойнить её с табличкой «теги у фильма», результат сгруппировать и сравнить count и max(Q_inc).

Про скорость:

Написание (питон?) «m.tags & include == include» подразумевает какую механику соединения/сравнения множеств? Просто последовательно ? или с учетом их распределения ?:)

А обрабатываемые данные всегда влезают в ОЗУ?

А обработка этих множеств как будет параллелиться по нодам?

Paka_RD
()
Последнее исправление: Paka_RD (всего исправлений: 3)
Ответ на: комментарий от monk

Жаваскриптеры тоже.

Увы, пишут.

Текстовыми полями, это ссылку на жанр делать по имени жанра? А если в имени жанра опечатка, то при его изменении дополнительно по таблице фильмов подмену делать?

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

А адрес кинотеатра как в строку запихнёшь? Чтобы потом можно было найти какие фильмы в этом же городе показываются?

Разбивку адреса по токенам не делал только ленивый.

В питоне в поле не требуется ограничивать тип

Что обрезает доступные сериализуемые типы до тех, с которыми СУБД умеет работать.

Нет.

Требуется. Иначе будет всё та же проблема с опечатками. У тебя двойные стандарты.

То есть выбрать все фильмы, у которых есть все тэги из множества include и нет ни одного из множества exclude?

Джоинами. Про оптимизацию тебе уже оратор выше сказал.

А в чём принципиальная разница, исполнять чужую программу с импортом чего-то или чужой пикл?

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

Это ты критерием скорость разработки поставил.

Нет. Я поставил критерием совокупность архитектурных требований. А ты, имея крайне смутные представления о продуктовой разработке, начал нести ахинею.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от Paka_RD

У таблички include сделать вычисляемый

Это еще зачем? Я так и не понял что означают слова:

tags - поле в таблице movies со списком тегов.

Я думал что в этом поле (tags), стоят значения: (триллер, комедия) - к примеру. Список тегов.

mx__ ★★★★★
()
Последнее исправление: mx__ (всего исправлений: 1)
Ответ на: комментарий от mx__

Хранить в одной ячейке конкатенацию тегов нельзя.

В крайнем случае - varray или nested table, но этого лучше избегать - субд внутри всё равно заведёт табличку под nested table, a реляционная парадигма поломается.

Paka_RD
()
Последнее исправление: Paka_RD (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.