6 ms·
All this pain when most of the time folks could just fire up Postgraphile or Hasura, point them at their Postgres database, and go sip mai tais by the pool. I h
by ttfkam 3y ago
All this pain when most of the time folks could just fire up Postgraphile or Hasura, point them at their Postgres database, and go sip mai tais by the pool. I honestly don't understand why folks insist on writing their resolvers by hand in 2023.
"But I don't want folks having direct knowledge of my database schema," I hear as a retort.
1. Most of the time for most projects, the GraphQL schema or REST API is a direct analog of the database.
2. You can always make a new Postgres schema with views to expose just the data features you want with annotations to show where the foreign key relationships should be. Still worlds easier than writing and maintaining resolver and data loader logic by hand.
- brycelarkin 3y agoPostgraphile just released their v5 update (still in beta) and it’s even more awesome than v4. No more crazy queries to address the n+1 problem.
- Exuma 3y agoPostgraphile looks awesome. Thx for pointing it out
- ShadowBanThis01 3y agoI looked at GraphQL and couldn't get past the fact that it doesn't provide a way to express joins. Isn't that a problem?
- alex_lav 3y agoA join is a SQL-ism. GraphQL allows you to express _relationships_, which the underlying database would fulfill via a join.
- tango12 3y agoTrue - but the important point worth discussing here is that most common GraphQL implementations make it really hard to think in joins. The resolver pattern and data loader pattern make joins really painful. eg: implement a simple top-N query (fetch 10 users and the most recent 5 articles for each) in GraphQL with a resolver tree, or even data loader.
- alex_lav 3y ago> eg: implement a simple top-N query (fetch 10 users and the most recent 5 articles for each) in GraphQL with a resolver tree, or even data loader. A most_recent_articles view?
- tango12 3y agoquery { Users (first: x) { …, articles (first: y, sortBy: CREATED) { .. } } } How would one implement the users and articles resolvers - that would be as efficient as a most_recent_views in sql?
- pharmakom 3y ago- Resolver for the most recent articles - Resolver for n users by ID - Caching layer This will be quite performant in general since in worst case we do 2 SQL queries but in most cases we hit a cache.
- tango12 3y agoThe problem is that it’s hard to get the articles resolver make one query to fetch all the recent articles. So you’ll end up with n+1 fetches from the db. In the articles resolver, you have to: Select from articles order by created where article.user_id = X limit 5. And you’ll have to run this statement n times - once for each user. Not sure how a data-fetching cache layer at the app server layer will help here.
- alex_lav 3y agoSorry, I feel like there must be something I'm not understanding about the limitation you're trying to convey. WITH relevant_users AS ( SELECT id FROM users WHERE id IN (1) ) SELECT users.name, mra.title FROM users INNER JOIN most_recent_articles mra ON users.id = mra.user_id INNER JOIN relevant_users ON users.id = relevant_users.id; This is a single query that can fetch users filtered by the First: (although I just did in, you could add whatever filtering options you wanted in the relevant_users cte) with the most recent articles view we've discussed previously.
- gedy 3y agoHasura.io was mentioned above. I'd recommend you take a look at their schema extensions to do this. However, please keep in mind graphql is an API convention, much as REST is used. REST doesn't provide a way for joins either. Both are not direct DB access.
- ShadowBanThis01 3y agoAnd thus I don't really see the point. When it first came out, I hoped GraphQL would allow me to craft my queries in one place, and reduce the tedium and error-proneness of writing client and server code to pack and unpack the data structures. But it doesn't, as far as I could tell. Thanks for the reply.
- JCharante 3y agoYou might want to look into tRPC and how the client has the definitions for the server. It’s a really nice dev experience
- ShadowBanThis01 3y agoThanks! I will.
- wdb 3y agoYeah, Hasura is really nice. Saves a lot of time