
Building a CRUD App with Datomic Cloud Ions - tosh
https://jacobobryant.com/post/2019/ion/
======
jmiskovic
I'm working on a web app using the mentioned Datascript library. It is in-
memory DB with Datalog query language, written as open-source implementation
of Datomic principles. It's usable from Clojure(script) and JS.

Takes some time to adapt way of thinking to its data model and I'm just
starting to reap the benefits. Boy does this thing pack some serious power!
Prodding the data for complex relations ("find two friends with same birthdays
that also have cars of same color") becomes trivial, which opens up a whole
new possible features I haven't dared to consider before. Combine it with
React rendering and you get a very clean and powerful model for building
complex web applications. I'm enjoying it a lot.

If anyone is interested in Datalog query language, here's a good resource:
[http://www.learndatalogtoday.org/](http://www.learndatalogtoday.org/)

~~~
amelius
> "find two friends with same birthdays that also have cars of same color"

Wasn't that always a simple thing to do, e.g. in SQL?

And how about monitoring changes in the database based on a query? Is that
possible and efficient?

~~~
jmiskovic
It's possible in SQL, in Datascript it's effortless. There's a big difference
in mental overhead and thus how often you would want reach into DB. There are
other benefits.

You don't do any string mungling, your query is itself composed of data
structures. You can build it easily with code, so your queries become as
elaborate as you can generate them.

Unlike SQL tables that you have to figure out from start, the data model is a
collection of facts, with each fact consisting of {entity_id, attribute,
value, transaction_info}. By adding facts to database you build the knowledge
about entities and different relations between entities in an organic way. You
can still use the table model, or you can use graph model.

The whole DB is just a value in memory. You can transit it to server, store
history copies in memory (for undo/redo), do diffs, whatever you need.

As for monitoring changes, I'm using the Posh lib (also mentioned in article).
It monitors the DB and re-renders react component if there are transactions
relevant to component's queries. It seems very efficient so far, but I still
have to test it with large number of components and transactions.

~~~
amelius
> As for monitoring changes, I'm using the Posh lib (also mentioned in
> article). It monitors the DB and re-renders react component if there are
> transactions relevant to component's queries. It seems very efficient so
> far, but I still have to test it with large number of components and
> transactions.

Interesting. Do you know if, upon a change, it reruns the queries from
scratch, or does it update the results based on the actual changes?

~~~
jmiskovic
It will re-run the queries whenever new transactions contain new data for
queried entities. It does so by pattern matching on transaction data.

For truly reactive datalog subscriptions, let's see what happens with clj-3df
project. Unlike Datascript, it requires you to use server infrastructure right
from start.

------
amelius
I see two problems with Datomic: the pricing seems a bit high for home use,
and the professional version has the problem that you have to submit your data
to the cloud, which is not always possible as clients may not always allow
sharing of data with 3rd-parties.

The ideas seem interesting though. Is there an open-source equivalent of
Datomic yet?

~~~
profchaos69
This looks promising
[https://juxt.pro/crux/index.html](https://juxt.pro/crux/index.html)

datalog, high performance, flexible deployment options, open source.
especially interesting for us because you can actually remove data for
gdpr/compliance reasons. Datomic has a lot of trouble with that in our
experience

~~~
nickcox
It does look cool. Is anyone out there using it in production?

~~~
mping
I'm guessing the creators solved a real business need and decided to go open
source. Really nice folks btw. Props to juxt.

