LINUX.ORG.RU

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

 ,


0

6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Мы про персональную базу фильмов.

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

Мы про персональную базу фильмов.

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

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

Я не про создание, а про редактирование. Решил пользователь переименовать «drama» в «драма» и всё, поля ссылаются в никуда и жанр считается строкой, а не элементом справочника.

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

При запросе в SQL?

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

Нет.

genres.drama.name = "драма"

Всё, что ссылалось на этот жанр, продолжает ссылаться.

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

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

Я поставил критерием совокупность архитектурных требований.

Ты заявил, что на SQL меньше стоимость разработки и поддержки. Стоимость поддержки для внешней СУБД больше, чем для её отсутствия. Для встроенного SQLite такая же. Стоимость разработки без необходимости делать преобразование в таблицы и обратно ниже, чем с такой необходимостью. Экспорт в JSON произвольного класса сделать также намного проще, чем его же в таблицы SQL СУБД (есть ORM, но не для всего работает).

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

У вас в базе ФИЛЬМЫ сколько строчек на 1 фильм?

На уровне языка программирования одна. На уровне SQL во вспомогательных таблицах десяток где-то.

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

Решил пользователь переименовать «drama» в «драма» и всё, поля ссылаются в никуда и жанр считается строкой, а не элементом справочника.

Ты вообще не в курсе, как правильно работать с СУБД, как и столяров? У тебя должна быть отдельная табличка с id/name для жанров, а к фильму должен быть приаттачен список айдишников тегов, а не сами жанры.

При запросе в SQL?

При добавлении адреса кинотеатра в базу.

Нет.

Ответ неправильный. Подумай еще раз.

Всё, что ссылалось на этот жанр, продолжает ссылаться.

См. первую цитату.

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

Черрипикинг, не принимается.

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

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

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

На уровне SQL во вспомогательных таблицах десяток где-то.

да ладно. Это еще зачем.

Таблица: Фильмы
---------------
Name: Название
Актеры: 0,15,24 (теги актеров через запятую)
Жанр: 3,7 (теги жанров через запятую)

Таблица: Актеры
---------------
id
name

Таблица: Жанры
---------------
id
жанр.
mx__ ★★★★★
()
Ответ на: комментарий от mx__

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

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

ну блин харе ломать комедию :)

вот прямая цЫтаты из введений по субд из норм тексбучин(а не для ...):

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

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

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

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

вопросы и последствия возникнут когда потребуется изменить сию сд ибо задача морфировала

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

а в целом SQL не чисто0реляционый от этого и траблы :)

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

ну покури историю банков данных

Бахмана того же

до реляционной модели - по сути (по мнению Дейта - тот ещё укурок впрочем) не было нормальных моделей - были именно реализации эдхок структур данных под конкретные вполне маштабные задачи - постфактум их обозвали иерархической и сетевой

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

релляционая модель избавляет от адрессов физического уровня

вот и всё -

ну и за счёт декларативности позволяет потенциально (как и компиляторы vs ассемблеры) более эффективно выполнять выборки(ака запросы)

вот и всё

хватит клоунадить :)

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

В ячейке лучше хранить атомарное значение, иначе, придется ответить на вопрос почему «драма; ужасы» и «ужасы; драма» записаны по-разному, храня одно и тоже.

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

Ну это зависит от потребностей и реализации, можно перед внесением в поле (изменением) сортировать данные.

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

Ты вообще не в курсе, как правильно работать с СУБД, как и столяров?

Ты написал, что поля должны быть только строковые. Для ид числовые обычно.

При добавлении адреса кинотеатра в базу.

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

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

Вот когда эта совокупность требований есть, согласен. Когда SQL берут просто чтобы было, не понимаю (и солидарен со Столяровым). Вот, например, какая совокупность требования для https://mp3-database.sourceforge.net/ ? Однопользовательское приложение с фиксированными запросами. Требует MySQL.

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

Вы тоже предлагаете жанры фильма хранить не во вспомогательной таблице, а списком через запятую?

Или считаете, что mx_ проповедник столяровщины?

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

Ты написал, что поля должны быть только строковые. Для ид числовые обычно.

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

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

Посмотри, как в интернет-магазинах выглядит форма для ввода адреса доставки и подумай сам.

Когда SQL берут просто чтобы было, не понимаю (и солидарен со Столяровым).

Столяров - кретин, утверждающий, что базами нельзя пользоваться вообще никогда. У него всё черно-белое: либо строим велосипеды, либо применяем кровавый тырпрайз на десктопах. Инженерное мышление у него отсутствует, как класс.

Однопользовательское приложение с фиксированными запросами. Требует MySQL.

Тут бы лучше подошел SQLite, скорее всего.

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

Или считаете, что mx_ проповедник столяровщины?

Столяровщина - это отрицание любых современных или устоявшихся подходов в угоду религиозным догматам.

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

Посмотри, как в интернет-магазинах выглядит форма для ввода адреса доставки и подумай сам.

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

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

Ты ещё и читать не умеешь? Вверху же написано «имеется какой-то значительный объём разнородной, но при этом взаимосвязанной информации и стоит задача обеспечить его хранение и в нём поиск, причём никто заранее не знает, какие именно задачи будут решаться на этом массиве информации, какие именно поисковые запросы будут делаться и вот это вот всё, то да, СУБД вполне может оказаться адекватным решением, и даже для работы с ней могут создаваться вспомогательные программки». Или ты считаешь, что это условие никогда не может выполняться?

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

Тут бы лучше подошел SQLite, скорее всего.

Вот музыкальный менеджер здорового человека: https://mpd.readthedocs.io/en/stable/user.html

Вся прослойка для хранения данных вот: https://github.com/MusicPlayerDaemon/MPD/tree/master/src/db

Никаких внешних СУБД, никакого SQLite. Всё работает просто и надёжно.

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

А как потом в WHERE писать поиск фильмов с жанром номер 3?

Не очень понял. Вы в форме выбраете КОММЕДИЯ - оно по таблице жанров ему присвоит его id_жанр и этот id_жанр (у вас номер 3) будет искать в поле жанра таблице фильмов.

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

Никаких внешних СУБД, никакого SQLite. Всё работает просто и надёжно.

А че так кисло то? Написали бы для начала свой ЯП зачем готовый то брать?

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

этот id_жанр (у вас номер 3) будет искать в поле жанра таблице фильмов.

Как это на SQL, если у вас в поле жанр: 3,7? Что написать в условие WHERE, чтобы получить все фильмы, у которых есть жанр 3 (и не получить тех, у которых этого жанра нет)?

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

Написали бы для начала свой ЯП зачем готовый то брать?

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

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

Как это на SQL, если у вас в поле жанр: 3,7? Что написать в условие WHERE, чтобы получить все фильмы, у которых есть жанр 3 (и не получить тех, у которых этого жанра нет)?

Стоп. Вы выше говорили что нужно обязательно чтобы только те фильмы у которых есть оба жанра. Короче это все фигня и делается при обработке формы запроса. Если вы там галку поставите и то то то сделает запрос на LIKE 3,7, если любой из них то IN ()

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

Тогда после изменения словаря придётся переписывать все строки вырезая буквы из них. И при любом обращении к такой ячейке её придётся разбирать.

В любом случае, для хранения набора «чего-то» есть специальный объект - таблица. А в ячейке стоит хранить единичное значение.

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

Если семантика задачи не ложится на существующие языки,

Т.е. по вашему база фильмов не ложится на SQL?

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

Тогда после изменения словаря придётся переписывать все строки вырезая буквы из них.

В смысле?

0-комедия
1-ужасы

что переписывать то?

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

Т.е. по вашему база фильмов не ложится на SQL?

Без обрезания задачи с ограничением мест, где могут находится фильмы и структуры этих мест — нет.

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

сделает запрос на LIKE 3,7

И кроме «3, 7» найдётся «33, 75», зато не найдётся «3, 5, 7».

Я выше предполагал, что список тэгов, как принято в реляционных таблицах, хранится в отдельной таблице с колонками movie_id и tag_id.

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

Поэтому «На уровне SQL во вспомогательных таблицах десяток где-то».

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

Конкатенированные строки «0; 1; 2» менять на «0; 2» при удалении из словаря жанра id=1.

Можно сделать миграцию и пробежаться по всем записям, подумаешь 1 запрос по сути.

Кстати а в вашем случае как выглядит такое удаление?

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

Так она так ущербно и выглядит, потому что привязана к типизированной таблице.

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

Ты ещё и читать не умеешь?

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

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

Вот музыкальный менеджер здорового человека

Спасибо, как-нибудь обойдусь без пердолинга.

Никаких внешних СУБД, никакого SQLite. Всё работает просто и надёжно.

Я тоже так могу. Есть хром, который хранит историю браузера в SQLite. Всё работает просто и надежно.

Еще раз: черри-пикинг не является аргументом. Доступно?

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

Будет обычное удаление строк из таблицы «жанры у фильмов» (movie_id, tag_id) по условию tag_id = 1. Причем поиск таких строк это очень быстро.

Разница с вашим вариантом в том, что нет ковыряния в буквах строки (парсинг это плохо).

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

Будет обычное удаление строк из таблицы «жанры у фильмов» (movie_id, tag_id) по условию tag_id = 1. Причем поиск таких строк это очень быстро.

Понятно, ну х.з. нужна ли такая таблица … думать нужно.

Там удалил фильму и все, а тут нужно еще в этой таблице тоже удалять …

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

лол в том что они даже 60..70 годов достижения дореляционные отвергают :)

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

ох ё:

поле - множество айдишников жанров ( али ещё более хитрая обьектное поле - где наиболее ходовые тут же а хвост жанров в «экстенте» <- это вообще частности физического уровня ) - для пользователя поле множество жантов проверяющие

как радостно что такой уровень компетентности достаточен для сеньёро-лидства

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

Есть хром, который хранит историю браузера в SQLite. Всё работает просто и надежно.

Странно, что с такой любовью к СУБД пользуетесь ext4, а не чем то вроде Database File System.

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

Смотрим на какой-нибудь ебей - всё совершенно просто и понятно.

Вот смотрю:

https://dhxn9dot0zbz3.cloudfront.net/wp-content/uploads/2016/05/ebay-shipping-adress-02.png

Области нет, на район, город, населённый пункт одно поле «город». Даже номера дома нет…

В общем, похоже SQL очень негативно влияет на восприятие мира.

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

В общем, похоже SQL очень негативно влияет на восприятие мира.

Больше похоже на СШП головного мозга.

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

Странно, что с такой любовью к СУБД пользуетесь ext4

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

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

Области нет, на район, город, населённый пункт одно поле «город». Даже номера дома нет…

Область - это штат. Номер дома у них записывается перед названием улицы, в некоторых формах - отдельно. У нас - после, разница не принципиальна. Как видишь, сюда прекрасно ложится даже российская система адресации, проверено на себе. И еще немецкая и кипрская тоже ложится, тоже проверено на себе.

В общем, похоже SQL очень негативно влияет на восприятие мира.

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

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

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

Для полноты картины нужно еще получить список фильмов, входящих в тег.

Упс O(n^2) получился

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

ну и в чём затруднение

вон ровно так же архитектурно(относледование от Persistent) как в вышеуказанной книге(тока на плюплюсах) в ZODB было наверчено - и вполне успешно было популярно с десяток лет - тока есть нюанс = прикладные программисты в этом случае должны быть более компетентными в части архитектуры объектной декомпозиции

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

и в этом случае sql облегчает труд в коллективах кодеманки

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

Для полноты картины нужно еще получить список фильмов, входящих в тег.

Это как раз легко. SELECT DISTINCT movie_id FROM movie_tag WHERE tag_id = &id.

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

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

и в этом случае sql облегчает труд в коллективах кодеманки

По твоей же ссылке для решений без SQL

Advantages: Ultimate speed. Unlimited data complexity.

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

monk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.