This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-02-16
Channels
- # beginners (7)
- # boot (63)
- # capetown (1)
- # cider (20)
- # clara (15)
- # cljs-dev (5)
- # clojure (195)
- # clojure-austria (2)
- # clojure-dev (46)
- # clojure-dusseldorf (9)
- # clojure-germany (6)
- # clojure-greece (36)
- # clojure-italy (5)
- # clojure-nl (4)
- # clojure-russia (173)
- # clojure-sg (1)
- # clojure-spec (93)
- # clojure-uk (65)
- # clojure-ukraine (2)
- # clojured (9)
- # clojureremote (1)
- # clojurescript (52)
- # core-async (14)
- # core-logic (5)
- # cursive (21)
- # data-science (8)
- # datomic (60)
- # emacs (83)
- # jobs (9)
- # jobs-discuss (7)
- # juxt (6)
- # klipse (2)
- # leiningen (1)
- # lumo (24)
- # mount (4)
- # numerical-computing (1)
- # off-topic (18)
- # om (37)
- # om-next (5)
- # onyx (13)
- # pedestal (1)
- # perun (44)
- # proton (2)
- # rdf (3)
- # re-frame (24)
- # reagent (4)
- # remote-jobs (3)
- # spacemacs (3)
- # testing (6)
- # vim (10)
- # yada (2)
@bernik вроде тока датомик, есть еще mentat от мозилы сделаные по образу датомика+датаскрипта (https://github.com/mozilla/mentat) но вроде immutability там нету, хотя я не уверен. Если других вариантов нет, а датомик не канает в силу каких то причин то можно сделать самому (ну не весь датомик конечно ), либо руками везде пихать триггеры на все таблицы, либо старый (анти)паттерн EAV модель, как например вот тут http://weblogs.sqlteam.com/davidm/articles/12117.aspx
Еще интересный вариант взять какую-нить queue систему (Apache Samza) посередина и пушить все изменения/создания туда как например в этой статье http://dchambers.github.io/articles/databases-are-dead/
Ну и еще отсюда https://news.ycombinator.com/item?id=11689674
I believe you're describing what is typically referred to as an "append only" datastore.
The biggest-name in the game is Google BigQuery
во нашел https://github.com/mirage/irmin, на окамле аж, годно
интересно что почти все статьи про immutable databases написаны авторами которые знают и юзают Clojure. Т.е. с одной стороны датомик да, с другой стороны immutable data structures есть много в каких языках, а такое ощущение что тока кложуристы подсаживаются на это с полной силой 🙂
в каком-то смысле rethinkdb это поддерживает https://www.rethinkdb.com/docs/changefeeds/ruby/
там компания вроде как загнулась, но лут с трупа собрали и теперь она доступна в опенсурсе https://www.theregister.co.uk/2017/02/07/rethinkdb_lands_license_to_live/
ну вот как-то так и получается, что все городят какие-то кастыли(триггеры, отдельные таблички versions/history), а искоробочного варианта нет. с другой стороны, в датомике эта hisory-db никак не настраивается, насколько я понимаю. нельзя настроить время жизни этого лога(потому что удалять нельзя) или, хотя бы, какой-то механизм типа git rebase
, который бы в общем случае выглядел бы как reduce по истории
Интересно что в статье по дизайну постгреса от 80 года был пункт про сохранение историчных данных и запросы над ними - из этого остался только mvcc
У нас что-то типа такого - http://clarkdave.net/2015/02/historical-records-with-postgresql-and-temporal-tables-and-sql-2011/, но без тригеров
@bernik Вот удаление старых данных: http://docs.datomic.com/excision.html
вместо эксижена рекомендовали менять базу, как rolling log file appender. что бы окно хистори было сколько-то месяцев/лет крайних
типа эксижн - на случай судовых требований и тд. и он не удаляет-удаляет, а что-то за собой оставляет, tombstone какой-то
с учетом этого всего и лимита датомов, есть смысл данные делить на несколько баз сразу, чтобы "индивидуально" принимать решения и иметь дело с ростом хистори
@dottedmag такой rebase скорей для оптимизаций вида истории. например сделать squash мелких изменений в одно большое, чтобы не делать тоже самое каждый раз когда захочется посмотреть историю изменения документа
для чего нужны персистентные базы, какую задачу решают? ведение истории изменения поля?
скажем, я пишу сервис отслуживающий фоловеров. т.е. нужна история изменений сета с айдишниками. Что бы я сделал в SQL: таблица 1: колонки user_id, timestamp, follower_id
(+ фоловер подписался, - отписался) таблица 2: хранит последнее известное состояние (список id фоловеров). чтобы показать историю, беру текущий стейт из второй таблицы и отматываю до нужного таймстампа по первой. итого два селекта
в джаве ты тоже можешь руками "атомы" менеджить между тредами без канкаренси проблем, только за###шься
датомик, как и кложа - по пунктам - не очень убедительно звучит, но если как целый продукт расматривать - очень круто.
потому посмотри презентации - там комплексно описано, чем датомик четкий: запросы на клиенте, кеш на клиенте, бесплатный скейлинг на чтение, запросы по истории, любой сторадж и тд
ок... ну значит я неоилятор, блин, мне написать свой велосипед как-то проще.. может задач не было подходящих
@misha а ты его юзаешь в итоге где?
ну кроме как поиграться и забыть я имею ввиду
там же где и реакт нейтив, но последние полгода+ я в мобилочке колупаюсь, бекенд не трогал совсем, но синк датаскрипта с датомиком у меня черновой нахачен уже
у меня юзкейс: на мобиле датаскрипт, на сервере датомик, синхронизация - 2 страницы кода. сохранение кложа-типов при записи/чтении, запросы по истории, даталог и пулл-паттерны динамически можно собирать (а не бл##ские sql строки плюсовать)
ну ты уводишь на sql я просто показал как я бы решал задачу бэклога если я правильно понимаю смысл персистентной базы. насчет sql btw google с тобой не согласен http://datascienceassn.org/sites/default/files/F1%20A%20Distributed%20SQL%20Database%20That%20Scales.pdf
datomic по моему - это гибрид orm и базы данных. Как раз персистентные аппендонли DB не уникальны - в смысле что mvcc часто используются для изоляции транзакций, и там оперируют снэншотом базы данных
datomic интересная композиция - append only, search and indexes on pear , triple store ;)
(единственный упрек sql из сообщений выше - конкатенация строк для динамического построения запросов)
Ну она достаточно важна, иначе это игрушка, которая начнёт тупить на миллионах записей
При этом трипл обрекает на большое количество join и на более менее сложных запросах хьюманбрэйн уже не справится
кажется мне, что ты рассматриваешь характеристику "трипл стор" вне контекста конкретно датомика
ну там же куча слоёв кеша у них и тд, те же персистентные данные, которые может там чота ускоряют, и тд
у меня ни живого апликейшена нет, ни такого объема данных, ни сорцов датомика, так что хз
Тут вопрос откуда исполнение начинать - и планировщик может найти на порядки более эффективный путь
реакт вон ускорили, где сравнивали хеши объектов. я баз данных не писал, и деталей алгоритмов не знаю, может там есть чо ускорить кешом и персистентностью
@nicola слушай, а ведь можно считать сколько в базе записей конкретного атрибута, и в зависимости от этого менять местами стейтменты в запросе
So that is what we've decided to do (as of 0.8.3372). Now, in the case of the second query, we will run it in the order you specified and this will run as fast as the first query. If you manually write it in the second order, it will run slowly. But, rather than wondering what is happening in a black box and trying black art things like the [(= ?n 4)] clause, you can simply try another order.
я может сопляк еще, но мне кажется, что это мелочи всё (руками скорость квери проверять) в сравнении с полезняком датомика
а разве так часто бывает, что сегодня abc запрос в 10 раз медленнее, чем acb, а завтра наоборот, а послезавтра снова?
например для одного пациента оценка выдаст t1 - 100 rows, t2 - 100000 rows, t3 - 500rows
в бд метаданных для кино в сони такого нет, даже с учетом того, что там пере-импортировались данные для фильма сотни раз не перетирая, а аппенд онли
т.е. если там вспухает таблица какая-то - она скорее t3 всегда, а чтоб вспухла t1 - таких бизнес запросов нет просто
stuartsierra [3:41 PM]
<@U0514TE0F> It means that you are responsible for monitoring and optimizing the performance of your queries based on your data. Future releases of Datomic may be bundled with tools to assist in this analysis, but they are not part of the current release.
мне всё еще кажется, что твой пример надуманный можно acceptably заоптимизировать раз, и через пол года перепроверить актуальна ли оптимизация (помножить на пару десятков тяжелых кверей в твоём проекте)
кажется, это решается разовой оптимизацией и периодической перепроверкой. доказать не могу
Ну, да. Workload более-менее известен, а если меняется - всё равно надо заново смотреть, как что происходит.
@misha Даже периодически проверять на надо, а просто впихнуть инструментирование и глядеть, если время запросов начинает вылезать за лимит.
@dottedmag я ~ о том же
может как-то так? приятнее читается
(let [offset (cells-offset coord (-> state :draw :brush))]
(update state :field (partial merge offset)))
Да. Мне нравится. Спасибо Никак не могу привыкнуть подпихивать let для читабельности
get-in
без дефолтного значения лучше заменять на ->
?
(если ключи это кворды)
а если еще и шрифты с лигатурами, то стрелочка красивше.
А. Так это еще от шрифта зависит. Думал, от темы Всё. Теперь красота
@kgofhedgehogs select-keys
+ что-то ещё, типа (select-keys s (keep (fn [[k v]] (when v k)) (d :show)))
{:framerate 15, :generation 130}
Спасибо
Как лучше?
#(update % 0 name)
или
(fn [[k v]] [(name k) v])
Входит типа MapEntry, где ключ это кворд, а выходит пара ключ значение, где ключ это String
(select-keys s (keys (filter val (d :show))))
@kgofhedgehogs Второе понятнее