Azimutt - Explore your database, thanks to Elm ^^

Hi everyone,

Today I’m really proud to announce you I finally published https://azimutt.app, an ERD tool to explore your database schema and stays relevant even with hundreds of tables ^^

It’s my first project with Elm, in fact, I learned Elm to do this project as I was looking for a safe frontend language. And I must say that it was a real pleasure. Even coming from the statically typed and functional programming side of Scala, I learnt a lot doing this project and Elm changed my perspective of programming in a few ways (look for guarantees in your code, not only types ^^).

As it’s my first Elm project, I have probably a lot of things to improve in my code. I will be really honored to discuss with you if you have some improvements to suggest: https://github.com/azimuttapp/azimutt
Of course, any feedback on the application itself is also more than welcome :smiley:

Have a nice day,
Loïc Knuchel

26 Likes

That’s a very beautiful app. I’m not dealing with schemas, but if I were, I’d use it ^^

1 Like

Thanks @mattpiz !
How lucky you are! :laughing:

1 Like

Impressive! I have been looking for such an app, and will be using this in the future.

I found a small bug:
When zooming the Context menu of a table is positioned wrong. Also Ctrl-Scroll zooms opposite of my expected zoom (I expect ScrollUp=Zoom In).

And a few suggestions:
I found the left menu (From pressing the logo) by accident, but that was essential for efficient use.
Show all tables from the start could be a nice “prompt” at least.

Hi @nil (are you tricking developers with your pseudo ? ^^)

Thanks for giving a try and your feedback :muscle:

About the context menu when you zoom, yeah I know, it’s driving me crazy and didn’t succeeded to fix before the release, it’s a shame! From my investigations, Bootstrap dropdown auto-placement don’t work well with zoom. We are moving to tailwind and I hope it will fix this very annoying bug :frowning:

For the zoom, I think you are the 4th to tell me that, clearly I will change the direction ^^

Totally agree the menu is not good. I didn’t figure out where to put these buttons properly yet but this is clearly on my improvement list. If you have some ideas about that I will happily take your opinion :wink:

On the “show all tables” I have mixed feelings. It’s automatically done when you have less than 10 tables but for more I didn’t feel it’s really practical, especially with my current placement algorithm: random :laughing:
Maybe I can move the threshold to 20 and add a prompt when under 50… What do you think ?
How many tables did you had ? Does the show all really makes sense for you ?
If you could elaborate a bit it could help me better understand :slight_smile:

I used it a bit more and see the use for starting with the subset of the scheme. Had just tried the two Wordpress and gospeak datasets. I see that it scales better to start with one “Central” table, and add the references as you create the layout. Not sure how to communicate this in the UI though :smiley:

PS: Consider making the [/] shortcut in the search box visible. GitHub’s search input for inspiration image. I also could not use the search to add tables by keyboard navigation. That might be a bug?

Happy to see you exploring from a table and expand and find it useful. Also, examples are good to test the product but exploring a schema with real needs is a bit different :wink:

For the search, making the hotkey shortcut visible is definitely on the list. But after fixing the navigation issue (top/down arrows & enter). This is really annoying and I don’t know why the events don’t fire in the input (same for escape) :frowning:

So yes, I have a very long list of necessary improvements and as it’s on my free time it could take some time but I hope in a few months to have everything fixed for a much smoother experience :smiley:

Looks really cool ! Congrats !

However, I have some issues finding “paths”. I tried with the “wordpress” example, and the app fails finding a path between “users” and “posts” (whatever the direction of the search).

Hi @sebbes
Thanks for your feedback, indeed, the “find path” feature is built using foreign keys, but the wordpress schema doesn’t have any (:sweat_smile:), even if they do joins, they are not structurally enforced by the database schema.
One thing I plan to fix that is to allow users to declare some links manually so the find path could use them.
If you want to try this feature, use the gospeak.io schema, or your own (if it has foreign keys) :wink:

Hey @loicknuchel, I mainly wanted to add some praise. The app seems really well thought out, particularly the control you have over what to include in the diagram and the ability to save different views. This feels like the workflow I never knew I wanted until trying it just now.

One niggle I ran into was that there were many errors parsing the schema. None of them were important in terms of exploring the schema but I was left with a lot of notifications to close on the right. A close all button would be really nice.

edit: for convenience I added an issue, https://github.com/azimuttapp/azimutt/issues/17. If you think it’s a good idea I’d be happy to add it myself (not quite sure how the ux would work so open to suggestions here).

Hu @opsb, thanks a lot for your kind words. It means a lot to me as it shows it didn’t code only for myself a strange app ^^
Do you mind if keep your words for some testimonials ?

Right now I’m improving the parser so hopefully you will not have errors soon :wink:

Thanks a lot for the issue and the PR proposal, it’s very welcome :slight_smile:
Don’t hesitate to reach out if you have any question about the code. And if you have some improvement suggestions, they are also very welcome (this is my first Elm app ^^).

Hey, yep very happy for you to use my words and I’ll take a look at adding the PR tomorrow.

1 Like

Nice! Really beautiful app and it works quite smoothly. :grin:
I especially like that you can start from scratch and build up the graph with only the tables which you are interested in. In some other tools it’s always quite an info dump.

Speaking of other tools: If you haven’t yet, you should check out Salesforce’ Schema Builder, there might be a few features to steal. :stuck_out_tongue:

Is there any chance that you extract your graph rendering code into an extra package? I’m planing to build something similar and a graph rendering library would be a great starting point. :innocent:

1 Like

Hi @ad-si
Thanks for your kind words :slight_smile:

Yep, I started it out of the frustration of other tool that become quite useless when you have 50 > tables (I have 750 right now :scream:). Pretty happy you like this choice :slight_smile:

Thanks for the link, will definitely check. Is there any specific feature you would like to see ?

Regarding the graph rendering as an external package, to be honest I don’t know… It’s not I don’t want to but I’m not really sure how to do it properly while keeping the flexibility I need for Azimutt and I doubt to find some time for this ^^
But we can definitely discuss about this and if you have a code proposal I would be happy to review it

Holy moly, 750 is quite a number. :sweat_smile:

Is there any specific feature you would like to see ?

Nothing in particular. Salesforce is just quite good at high density UIs. E.g. the curvy connectors (which you probably already have on your radar) and checkboxes, instead of the hard to differentiate eye / crossed out eye would be an improvement.

while keeping the flexibility I need for Azimutt

Yeah, that’s a good point.

I might simply start with borrowing some code from you. :innocent: Maybe we’ll figure out some synergies along the way!

Hi,

Nice project! I could see this being a very useful way to document and explore, and potentially collaborate with others on a schema description.

A few other things I’d like to see:

  1. Manual settings of relations. Not every application has foreign key relations defined, so it would be very useful to be able to define and save these in the app.
  2. Related to 1, in some cases join conditions can have more complex clauses such as “a.id = b.id + 1000”. Would be good to be able to specify these as well.
  3. Multiple databases/schemas supported in one project. In some cases it makes sense to join related table across databases.

Also may I suggest that you make it clearer which dialects of SQL are supported for schema import?
Seems like Oracle doesn’t work.

Keep up the good work!

Yes, I wanted to do them at the beginning but after noticed they are nicer but not so useful, so I focused more on features. But one day I will work on them :wink:

Yeah, feel free. If you see some possible improvements, don’t hesitate to open an issue or PR :wink:

Hi @bogdan-k

Thanks, very happy you like it :smiley:

Also your suggestions are pretty good, I had some in mind :slight_smile:
It’s still early and I focus more on improving UX and smoothness right now but I plan a lot more features like you suggested:

  • multiple databases
    • Being able to update a schema
    • Being able to load different schema files
    • Being able to select which database are used
  • relations
    • manual relations (as a fallback when I fail to identify them)
    • extract relation from code (ex: Ruby on Rails ArctiveRecord), also polymorphic relations
    • define a standard format so you can parse/write your own data and import them

Your point 2 is interesting, what is your use case? Documenting your database? (manually within the app? from imports?)
Can you develop a little bit ?

For SQL dialects, the goal is to support them all but you are right, currently I’m more focused on PostgreSQL and MySQL… But I will add it asap.

1 Like

Thanks for your answer @loicknuchel !

I’ve tested with the Gospeak.io and I had this result to go from talks → users :

I know this is experimental feature, but here are some suggestions:

  • we have 4 talks > users > contacts paths with no way to distinguish between them. Having the fields used to follow the path would be helpful!
  • the “direction” is unclear: to go from talks to users, we have a foreign key from talks to users. For the users > contact this is the contrary (foreign key from contact to users). Maybe it worth indicating this in some way like talks > users < contacts.

Hi @sebbes

Thanks for your message, and indeed, this is for this very reason this feature is still marked as experimental!

Two answers:

  • You have 4 times the path “talks > users > contacts” because they are using different paths (using created_by & updated_by fields in two tables lead to 4 path). For this, I added the “Search settings” just above so you can ignore such fields (created_by and updated_by) so you will have much less possibilities with less “strange” results
  • In fact, you have the used foreign keys as a title for the joined table (if you hover “users” or “contacts” table you will see which fields are used and in which direction. Totally agree, this UX is quite bad but I haven’t found a good one yet, so for now it will stay like this in experimental stage

The few ideas I have for now:

  • have a default list of fields to ignore (created_by, updated_by, deleted_by and their variants)
  • add a dashed underline on joined tables with a tooltip, so you are notified there is something special and the text appear immediately, not after a few seconds

I think this could improve the UX but it’s still quite far from good one… What do you think about theses suggestions ? Do you have others ?