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, так я мог просмотреть стек вызовов до нужного мне места и просмотреть как шла нужная переменная через эти вызовы. а так я чаще работаю на своем сервере где веду разработку и просто делаю вывод отладочной информации прямо на страницу приложения.
UFO just landed and posted this here
СУБД и не является реляционной ни в коей мере, она по сути многомерная 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