Pull to refresh

Comments 77

уже видел эту книгу но ещё не купил нет в Харькове
>в файлах MUMPS на диске практически нет места, которое бы хранило пустые, неиспользуемые пространства.

А вот здесь не свосем правда — дело в том что размер БД не уменьшается — это связано с тем, что даже если определённый блок удалён то он всё равно продолжает кушать место, сохраняя связи с другими блоками, которые ещё не удалены — это связано с тем что операция балансировки дерева — дорогая. Фактически же — проблема уменьшения размера БД решается двумя путями:

1й в лоб — создать новую БД — промерджить все глобалы из старой БД в новуюю. Заменить БД. (можно ещё пользоваться встроенным кашевскими средствами — но они как правило способны уменьшать размер только пустых БД)

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

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

К читателям вопрос — интересно ли будет посмотреть на реализацию многого описанного в статье — но не из перевода — а из моего личного опыта и кода? То есть могу продолжить и развить тему от своего имени — принципы организации справочников индексов теневого копирования журналирования и прочего…
В кроме Cache (который стоит непонятных денег — на сайте не указано) реализаций нет?
Есть. Можно попробовать open source проект GT.M

Есть и другие open source, но не такие серьёзные

С глобалами есть бесплатный качественный продукт с закрытым исходным кодом globalsdb.org/
Про globalsdb вы не правы: там не просто key->value, а полноценные глобалы у которых может быть куча индексов.
да, я коряво выразился.
Хотел доести мысль что это «тупое хранилище». без M/MUMPS это как без хранимок и без подзапросов в РСУБД.
Оно совсем не тупое. Если бы важные люди из Intersystem меня послушали и прикрутили бы поддержку PHP, то это было бы фантастически круто.

Иметь многомерное хранилище, выглядящее почти как php-массивы, и работающее почти как оперативная память, но при этом прозрачно всё сохраняющее на винт — это сказка!
не тупое было бы — если бы не удалили из него «хранимки». UPD жажда бабла и погубит Cache.

а со вторым абзацем согласен.
Вот цитата с сайта globalsdb.org
Globals DB is a FREE NoSQL Database offering by InterSystems,
which exposes the powerful multi-dimensional data engine
а order и query там оставили? если нет — то это обычный key-value если да — тогда weak multi-dimensional data engine.
вы с многомерными разряженными массивами работали хоть раз?
Да order там точно есть реализован методами next и previous в node.js и nextSubscript/previousSubscript в Java и .Net
вы совсем не знаете что такое каше и за что они берут деньги — так вот деньги берутся только за транзакции, теневое копирование журналирование и технологию ECP (это мультисерверная архитектура — когда вы работаете со многими разбросанными по серверам или миру базами данных в рамках одной среды и синтаксиса не сложнее описанного в этой статье) — без всего этого вы получаете globalsdb — это как mysql в реляционном мире.

А то что в каше намешано SQL и ООП — так это как раз для тех кто боится методов описанных в данной статье — потому что реализация всего там идёт на глобалах. То есть вы можете создать табличную БД средствами SQL — но все данные всё равно будут в глобалах и к ним можно обратится — так как сказано в этой статье (или почти так) то же самое и с объектами — но истинная сила — работать с данными напрямую — этот подход так и называется прямой доступ к данным.
вы совсем не знаете что такое каше и за что они берут деньги — так вот деньги берутся только за транзакции, теневое копирование журналирование и технологию ECP

Забыли ещё про сервер приложений с веб-фреймворком и бизнес-аналитикой.

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

А вот прочитав указанную вами выше книгу становиться ясно что большинству важнее LB и BIT возможности.

Это полезные вещи, но всем ли они нужны?

Кому-то не нужна поддержка?
Мне, например, не нужен бесплатный продукт (даже со скидкой) без поддержки. Да и поддержка поддержке рознь.
А за качество выше уровня «Мы вам перезвоним» и «Приходите завтра» всегда нужно платить.
Да!
«Мне, например, не нужен»
может с терминами ошибаемся (и вы и я) НО:
1. транзакции это стандарт языка
2. журналирование и так повсеместно
3. «Когда вы работаете со многими разбросанными по серверам или миру базами данных в рамках одной среды и синтаксиса не сложнее описанного в этой статье» — тоже есть в стандарте. Но в каше кажется ещё что-то добавили для удобства и скорости.
4. Без всего этого получиться просто MUMPS, а globalsdb в SQL мире скорее sqlite

Те кто боится глобалов — Каше не выберут они выберут привычный SQL.
А с Cache и globalsdb не стоит связываться.
globalsdb — просто key-value.

Да если вы боитесь глобалов то с каше и глобалсДБ не стоит связываться.

globalsdb — просто key-value. — что вы подразумеваете под «просто key-value»? Ведь так любой SQL-запрос можно обозначить как key а value — это его ответ — тогда любая SQL БД — это просто key — value — по вашей аналогии

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

:) Меня тоже сосчитайте.
мне не совсем понятно что есть хранимая процедура если отвязаться от SQL (по моему субъективному представлению — весь тот код который я пишу это сплошные хранимые процедуры — но могу ошибаться в методологии)

А вас посчитаю теперь уже трое! Пора начинать писать:)
В нашем случае — рутины на MUMPS.
кроме них я вообще ничего не пишу (разве что inc-файлы) значит мы сошлись в понимании
> А Cache — мутант: на базе MUMPS прилеплено SQL и ООП.

У меня данное сравнение почему-то ассоциируется с ГМО.

Простите, а как ещё в рамках единой архитектуры можно прозрачно совместить NoSQL, SQL, ООП, MDX?

В Delphi я могу написать так:

procedure Fast;
begin
  asm
    mov eax,1
    ...
  end;
end;

Выходит, Delphi тоже мутант?

Многим нынешним реляционным СУБД не хватает такого «ассемблера» внутри себя ради свободы и высоких скоростей, иначе бы движение NoSQL даже и не возникло.
Автоматика — это хорошо, но иногда выгоднее перейти и на ручное управление, если есть голова на плечах.
А Cache — мутант: на базе MUMPS прилеплено SQL и ООП.

вы так говорите, будто это плохо, знаете ООП там вполне хорошая вещь и постепенно становится еще лучше.
в последнем проекте практически не используем SQL хватает своей надстройки над глобалами для быстрых выборок данных.
Есть ещё и MiniM Евгения Каратаева.
На изначальную тему могу сказать, что для новичка в области СУБД вообще, не привыкшего втискивать реальность в плоские таблицы со связями, разреженные древовидные структуры, коими являются глобалы, более естественны.
Еще бы циферки которые расскажут о скорости работы. И сравнение их с парой других продуктов из SQL и NoSQL.
Это ж перевод.
А на каком примере вы бы хотели сравнить скорости?
Цифры есть и на других форумах приводились не раз, например здесь (довольно длинная простыня с примерами вставки и релизации запросов в один и несколько потоков).

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

Короткий и элегантный код часто мало коррелирует с высокой скоростью (один из примеров такого сравнения).
Из википедии: Язык MUMPS критики называют провоцирующим ошибки, поскольку:
— отсутствует обязательное объявление (декларирование) переменных;
— не поддерживаются привычные приоритеты арифметических операций (например, выражение 2+3×10 даёт в MUMPS значение 50);
— лишний пробел или разрыв строки может совершенно изменить смысл синтаксической конструкции;
— ключевые слова языка не зарезервированы и могут широко использоваться в качестве идентификаторов.
1 — это не только в нём
2 — согласен эта особенность но началу сбивает
3 — это не только в нём
4 — так может не пользоваться такой возможностью

какие то странные придирки
— достаточно языков в которых объявление переменных не обязательно и нетипизированных языков так же много
— я работал в нескольких проектах и не часто мне приходилось делать арифиметические операции, и знаете когда вы оформляете все операции в скобках это даже читается лучше, так что никакой проблемы просто не вижу.
— не совсем понятно о чем тут говорится, чаще скорее нехватка пробелов может приводить к проблемам.
— а тут то какие проблемы, и что с того что ключевые слова не зарезервированы из все равно не так много и если бы они были бы зарезервированы это привело бы к большим проблемам вы еще скажите что проблема в том что можно использовать кириллические имена переменных?
You may not realize it, but the majority of us developers have been living a sheltered professional life. Sure, we’ve got that living disaster of a C++ application and that ridiculous interface between PHP and COBOL written by the boss, but I can assure you, that all pales in comparison to what many, less fortunate programmers have to work with each day. These programmers remain mostly forgotten, toiling away at a dead-end career maintaining ancient information systems whose ridiculously shoddy architecture is surpassed only by the tools used to create it. Bryan H lived in such a world for over two years. Specifically, he worked at a “MUMPS shop.”

A Case of the MUMPS — The Daily WTF

P.S. Сам с этим MUMPS ниразу не сталкивался, но после прочтения истории с The Daily WTF даная статья выглядит как троллинг.
Сам натыкался на эту статью, и кое что там правильно. Но большая часть это притензии к древнему стандарту MUMPS и, простите, быдлокодерам, которые как известно нагадить могут на любом языке.

Это всё равно что чмырить VB.Net за недостатки Basic в котором не было даже функций.
Интересно увидеть вторую часть статьи. Пока действительно не ясно как ЭТО можно использовать, особенно когда один пробел и два пробела это разные конструкции языка =)) (да, работаю с sql)
Как это можно использовать я вам напишу — а что такое один пробел и два пробела например вот

s ^P(" ")=«индекс этого значения один пробел а само значение — это строка которую вы сейчас читаете»
s ^P(" ")=«индекс этого значения два пробел а само значение — это строка которую вы сейчас читаете»

строка символов состоящая из одного пробела — это и есть индекс по которому можно получить значение из глобала P
строка символов состоящая из двух пробелов — это и есть индекс по которому можно получить значение из глобала P

про различие пробелов в языковых конструкциях также могу написать но там не сложнее чем в прошлом примере
$get(^test) = 3
$get(^test(“a”,”b”)=”” ; поскольку на этом уровне индекса нет данных
$get(^test(“a”,”b”,”c”)=1
$get(^test(“b”)=””

Похоже, именно из этого языка растаскивают скобочки на смайлики.
А если серьёзно, то в третьей строке не 2 должно быть?
Если брать во внимание определение из примера SET ^test(“a”,”b”,”c”) = 2
То $Get(^test(“a”,”b”,”c”)) вернет 2
А как бы сделать, чтобы движок форума кавычки не менял по своему усмотрению? Не совать же тег
<pre>
куда надо и не надо.
Напрягает самодеятельность типа той, которая в примере RoiS получилась.
В Альфа-Банке достаточно долго эксплуатировалась система частных вкладов и касса, написанные на MUMPS. Поделие фирмы esc/m. Любимая поговорка: «Глобали — глюкали». У мумпс очень хреновая связь с внешним миром, в нашем случае это была отгрузка в DBF
Неужели все банки экономят на специалистах? В сбере оракл роняют, в альфе умудряются глобали сглючивать…
В Альфе система полностью обслуживалась специалистами ESC/M и обычным инженерам ИТ залазить в неё запрещалось под страхом анальных кар. С одной стороны правильно, но с другой стороны — иногда она всё-таки падала, в основном, после внедрения разного рода обязательных апдейтов, а круглосуточной поддержки не было. Москва просыпалась, и тогда что-то можно было сделать.

Довольно много пишу на Cache (правильней говорить на MUMPS?) по работе. Ощущения, конечно, противоречивые: с одной стороны язык очень лаконичный и глобалы — это, пожалуй, действительно круто! Но отсутствие элементарных вещей (типа приоритета математических операций, о котором тут говорили выше) и IDE из доисторических времен, могут повергнуть в легкий шок человека, привыкшего к современным средам разработки и ЯП.
> Довольно много пишу на Cache (правильней говорить на MUMPS?) по работе.

Правильно говорить «много пишу для Caché на COS» так же, как «много пишу для Oracle на PL/SQL».
А что вас не устраивает в IDE и почему же с доисторических эпох, студия в Cache потихоньку но развивается, большой минус правда есть в том что она только под Windows.
— отсутствие рефакторинга
— автодополнение кода, которое вроде бы есть, но реализовано слабо, чисто «для галочки». Во множестве ситуаций не работает и дело тут вовсе не в том, что язык с необязательной типизацией
— практически нет синтаксического контроля, о подсказках к ошибкам вообще речи не идет
— нет форматирования кода
— примитивный отладчик

Да много чего, я ведь не пытаюсь никого убедить, что «Cache — это плохо!». Я Вас по форуму на sql.ru знаю как фанатика фаната этих технологий, так что все понимаю. Есть вещи в Cache (и в самой Studio, как среде разработки), которые мне тоже нравятся.
При использовании конструкции вида #Dim var As Type =… автодополнение свойств и методов объекта работает вполне нормально.
Да, я знаю про конструкцию #dim и стараюсь почаще ее использовать, я специально отметил, что проблема автодополнения не в мягкой типизации, а в том что оно в принципе «не видит» некоторых переменных или отваливается после «do» (до первой точки), к примеру.
— в 2013 студии есть зачатки рефакторинга, переопределение свойств методов и т.д. существуют уже давно
— проблема с автодополнением восполнена с помощью #dim, а если не необязательная типизация то что может быть проблемой для этого, особенности самого языка
— насчет синтаксического контроля это вы зря, он вполне себе нормальный, тем более что ошибок синтаксиса нет так то много для для каше они и объеденнены в одну ошибку SYNTAX, в студии есть проверка на UNDEFINED, (в настройках студии посмотрите как включить)
— есть некоторое форматирование при вводе, например при открытии фигурных скобок, а то что нет возможности отформатировать любой код как это делает тот же netbeans и другие, да это порой неудобно
— насчет отладчика сказать мне что то сложно, пользовался пару раз на поиграться, да и не вижу как его можно улучшить потому как приложения разные (консольные, веб, веб-сервисы) и сложно вообще понять как можно отлаживать удобнее сам язык достаточно предлагает средств для отладки кода. Одно время мне нравилось использовать сбор стека в каше через LOG^%ETN, так я мог просмотреть стек вызовов до нужного мне места и просмотреть как шла нужная переменная через эти вызовы. а так я чаще работаю на своем сервере где веду разработку и просто делаю вывод отладочной информации прямо на страницу приложения.
Честно говоря не очень проникся. Если отбросить оригинальный синтаксис, то остается по сути обычная бессхемная не реляционная база. Не увидел здесь что-то сильно отличное от MongoDB, к примеру.
СУБД и не является реляционной ни в коей мере, она по сути многомерная key-value СУБД, отличий возможно и нет, но mumps много старше и проверена годами.
Вот этот код вызывает вопросы:
s company=”B~” f s company=$o(^Employee(company)) quit:$e(company,1) ’= ”C” do . ; сделать что-нибудь с записью
Сначала вы пишите, что стоит задача найти все записи, начинающиеся с «С». А после кода такой комментарий:
Если первая буква названия компании не “C”, выйти из цикла

Т.е. при первом же несовпадении происходит выход из цикла (и судя по коду, это верно).
Я чего-то не понимаю?
Поскольку автор англоязычен, то он предполагает, что имена компаний состоят из ASCII символов. Код тильды — 126. 127 код у DEL (это непечатный символ).

Иными словами для любого англоязычного справочника верно, что после выражения начинающегося с «B~» идёт, буква C или буквы C нет вовсе.

Таким образом цикл работает до тех пор пока в качестве первой буквы ему не попадётся любая иная буква, чем C.
Таким образом цикл работает до тех пор пока в качестве первой буквы ему не попадётся любая иная буква, чем C.

Именно. Такой цикл завершится при первом же несовпадении и не найдутся ВСЕ записи, начинающиеся с «С».
там отсортировано, поэтому пойдут все записи, начинающиеся с «С», а как только наткнётся на не начинающуюся — значит больше нужных и нет.
Это логично предположить, потому что индекс перед циклом выставляется в «B». Только откуда берется эта сортировка, особенность движка?
да, всё отсортированно по индексам массива.
А, вот нашел ключевую фразу:
Эта возможность начинать и прекращать обход глобала с любого конкретного индекса и на любом уровне вложенности индексов является уникальной функцией глобалов MUMPS.

Вообще, кто работает с highload sql-базами знает, что сортировка — дорогая операция…
В MUMPS хранение данных так постоено, что бы это было быстро. А вот «медленной» была бы операция вывода с сортировкой не по значениям индексов, а по значениям данных. Если программист не озаботился созданием соответствующего «индекса».

пристрелите м10, пожалуйста!

и mumps заодно

Sign up to leave a comment.

Articles