25 ms·
We Can Do Better Than SQL
- tathougies 7y agoThe article criticized SQL because the following expressions are incompatible > SELECT * FROM table and > SELECT count(*) FROM table This is actually not true, as both return table values. It then says that, in EdgeQL, every expression results in a 'set'. This is a distinction without a difference. I don't disagree we can do better, but this is the same.
- deleted 7y ago[deleted]
- deleted 7y ago[deleted]
- RedCrowbar 7y agoThere is a difference. You are right in a sense that scalar expressions are a form of a table expression, but... This is a valid expression: SELECT (SELECT count(*) FROM table) + 1 This is not: SELECT (SELECT * FROM table), 1 In EdgeQL: SELECT (count(SomeType) + 1) and SELECT (SomeType, 1) are equally valid.
- deleted 7y ago[deleted]
- Svip 7y agoThe brackets make it look like they are both subqueries and contained within in the EdgeQL examples. As such, you could write the examples in SQL like this: SELECT count(*) + 1 FROM table And SELECT *, 1 FROM table Both of which are valid in SQL. And you'd get the same result as in the EdgeQL examples. Indeed, a more relevant second counter example would be: SELECT (SELECT * FROM table) + 1 Not valid... unless `table` only had one row and one column containing a number.
- RedCrowbar 7y agoYes, and that's actually the point being made in the post. You need to rewrite your queries to make SQL happy.
- notimetorelax 7y agoIs this such a common problem that you need a new language to solve it?
- 1st1 7y agoWe think that people struggling with writing good/advanced SQL queries and the existence of ORMs and other heavy frameworks to make RDBMSes "friendly" is a serious problem. And inventing a a new querying language is a necessary step to make relational databases more accessible.
- munk-a 7y agoJust to clarify (and I strongly dislike overuse of ORMs)... Some people use a thing x A subset of those people use a subset of x called y This subset of people have built a tool to make y easier to express Thus x is invalid I think that's a really bad argument, if everyone was using ORMs then we'd all merrily forget about SQL and just use ORMs which would become the new "language for structuring queries", but we don't all, and EdgeDB in particular thinks that ORMs provide a much degraded expression set from SQL and thus want to tweak X so that it's as expressible as the tool to express Y but without making it just about Y... I think your goal boils down to shifting the trade-off point between X and Y - the extreme of which is writing a very expressive Y that also supports X but in a non-expressive manner.
- tathougies 7y agoThe EdgeQL query has no obvious meaning, unless (,) calculates the cross product. Saying SELECT Table1, 1 returns each row of Table1 along with 1 and that 1 returns the set {1} means that you have arbitrarily assigned each row of Table1 a row from the set {1}. This gives what you want in the case of a scalar, but what about a non-scalar. For example, suppose Table1 contains (John, Smith), (Alice, Perkins), (Bob, Best). Then, what should SELECT Table1, {1,2} return? If you do not say cross product, you have arbitrarily assigned rows to one another, resulting in meaningless data. If you say cross product, then you have rewritten the sql expression SELECT * FROM Table1, (VALUES (1), (2)) I don't disagree the SQL syntax is longer and has some unnecessary keywords, but unlike EdgeQL, the query means something particular.
- tathougies 7y ago> SELECT (SomeType, 1) This cannot be the case if you call each thing a 'set'. Unless `(a, b)` calculates the cross product, there is no meaningful non-arbitrary way to assign each element of a to an element of b. That would depend on an ordering, which makes it not a set to everyone but a marketing dept somewhere.
- RedCrowbar 7y ago`(a, b)` is a cross-product, just like "SELECT * FROM a, b"
- thwd 7y agoThey're saying that both of those expressions are valid, not equivalent. SELECT count(star) FROM table and SELECT star FROM table Are both valid, not equivalent. Furthermore, listing any kind of set depends on some ordering, be it random.
- tqi 7y ago> SELECT (SELECT * FROM table), 1 What would you expect to returned for by this query?
- dragonwriter 7y agoIt's only a slight misstatement; scalar queries are a subset of table queries in SQL, rather than different thing, but scalar queries are allowed in places where other table queries are not. The difference in EdgeDB isn't really everything returns a set, but seems instead to be that everything consumes sets and not just scalars.
- vpetrovykh 7y agoYou are exactly right about everything consuming sets in EdgeDB. Even when a function is defined on scalars, it's really defined on singleton sets. Literals are also singleton sets, so "1" and "{1}" are equivalent and so are "foo(1)" and "foo({1})". Usually we omit the set braces for singleton values to reduce visual noise.
- usermac 7y agoWhat is EdgeDB? It is new to me.
- 1st1 7y agoYeah, it's because it is new. We released the first public version a few weeks ago, here's a blog post with the announcement: https://edgedb.com/blog/edgedb-1-0-alpha-1 https://edgedb.com/blog/edgedb-1-0-alpha-1 Hope you will try it!
- benatkin 7y agoI skimmed the post and am not interested enough to look at it further. I'm not saying it isn't interesting at all, but I still need to carve out the time to learn Postgres' new features and check out RethinkDB again. If I had infinite time I would check it out. The MongoDB example is extremely contrived. If you wanted to do that with MongoDB you would add a new field or a new collection with full_name rather than doing a $map.
- 1st1 7y agoThe comment in the query mentions that it makes the query only 5% slower. You can drop the "full_name" part, but the query would be still too low level (even compared to SQL/ORM examples) and slow.
- benatkin 7y agoWhy are you combining separate fields in the first place? Document databases are denormalized. If you want a fair comparison, put full_name in a separate field in addition to first_name and last_name in each document. That's the way to use Mongo. The issue here is that a document db takes extra space, not that you have to use $map for the common task of searching a full name. You only have to use $map for querying things that you didn't plan to query.
- 1st1 7y ago
- nicoburns 7y agoOpen source (Apache 2.0), and implemented on top of Postgres. This is quite interesting. I love SQL, but there's definitely room for improvement.
- mongol 7y agoIt is interesting to see new approaches. But SQL is so entrenched, so available and so good enough.. it will be a very uphill journey to compete
- throwayEngineer 7y agoSo if you can handle the "complexity" of SQL and don't use NULL, SQL is fine?
- 1st1 7y ago> don't use NULL I'm not sure this part is realistic to do in a non-trivial setup. At the very least it's not a common thing to do.
- 6nf 7y agoYou either have actual NULLs in your tables or you have implied NULLs that don't exist in the actual tables but still come up when you do LEFT JOINs etc. I don't think NULLs are actually a problem in SQL. It's not like we're talking about pointers, it won't cause your server to crash if you use them wrong. NULLs in SQL are fine.
- ben509 7y agoThey're far worse than null pointers. They can cause subtle bugs that lead to queries that appear to work but result in missing or incorrect data.
- mjirv 7y agoI'm confused by this: > In EdgeQL, sets are flat, i.e. a set (including an empty one) cannot be an element of another set It seems like in the last example, they're returning a set (of movies) that contains other sets (directors, cast, reviews). Am I misunderstanding? I guess it would be helpful to see what the output looks like for these examples.
- RedCrowbar 7y agoThere are good examples in the tutorial: https://edgedb.com/docs/tutorial/queries#ref-tutorial-queries https://edgedb.com/docs/tutorial/queries#ref-tutorial-querie... The last query is still returning a flat set of Movie objects. The shape selector describes _related_ data that is also needed to be fetched by the query. So, the query actually returns multiple sets that can be reconstructed by the client into a graph of objects (or serialized into JSON).
- rammy1234 7y agoif you can compare SQL every syntax to every usecase possible , until then we cant claim what we are doing is lot better.
- deleted 7y ago[deleted]
- dubcanada 7y agoI wish it had slightly more details, like what does the last query on the page actually return? Also I am not sure how it's better yet. SQL is typed and has a ton of historical overhead and used in many different database softwares. This kind of just seems like a slightly different implementation of NoSQL syntax.
- 1st1 7y ago> [..] SQL is typed and has a ton of historical overhead [..] EdgeQL is strictly typed, here's more info: https://edgedb.com/docs/edgeql/overview/ https://edgedb.com/docs/edgeql/overview/ > slightly different implementation of NoSQL syntax. I'm genuinely curious what NoSQL syntaxes you are referring to.
- docker_up 7y agoI think "ease of use" over SQL is not the hill I would die over if I were trying to displace SQL. It's far too embedded throughout the entire industry and as a data analyst, learning EdgeQL vs SQL and then being locked into a new startup database that could disappear in a year doesn't seem like a high probability strategy. I wish the people all the luck but unfortunately SQL is "good enough", pretty standardized (I can use just about any relational database and get useful data by knowing the basics). The inconsistencies may be mathematically "ugly" but it's not hard to wrap your head around and overcome.
- save_ferris 7y agoTotally agree. It’s a bedrock technology that’s near-universal as far as company needs, at least in startup and web development environments. The JS framework churn makes me super appreciative of the stability that SQL brings.
- a13n 7y agoJS framework churn isn't what it was five years ago
- wbrasky 7y agoYou're right, it's far far worse now.
- tlrobinson 7y agoCitation needed? I've been using React for 5 years and don't foresee not using it any time soon. Even if it's still true, "churn" translates to progress. It would be hard to argue complex web application UI development isn't better off now than it was 10 years ago.
- geezerjay 7y ago> Citation needed? I don't have a citation, but a colleague of mine who's working on front-end projects repeatedly complains that today's JS stacks require half a dozen base JS packages, which in turn download dozens if not hundreds of ancillary packages, not to mention requiring a couple of transpilers and a bunch of tooling. And for what? Well, just to be able to render some text and a couple of buttons. Nowadays we have whole server projects that take less than 50MB of source code and dependencies to build, while a miserable SPA with a login screen and a couple of menus and buttons requires nearly 400MB of JS. That's pretty bleak.
- acomjean 7y agoWe can do better. I use sql a lot though I’m not great at it. This seems much better. The problem is getting a replacement on enough databases (storage engines?) so it’s universal. And performant. I’m not sure what’s involved with that but since there are a lot of open source dbs it seems possible. Nice work
- soAsian 7y agoI've been in IT for over 13 years. i really admired people at Silicon Valley trying to come up with new (old concept) to replace existing product. NoSql is a flop. It didn't take over SQL or make much of impact and now we got this.
- ape4 7y agoSQL reminds me of COBOL. Even replacing some of the UPPERCASE words in SQL with C-like symbols would be nice.
- 1st1 7y ago> Even replacing some of the UPPERCASE words in SQL with C-like symbols would be nice. In EdgeQL the keywords are recognized in any case. It is a matter of personal style.
- notimetorelax 7y agoAs is SQL
- 1st1 7y agoYes, we are not debating that.
- gugagore 7y agoThey make this comparison in the post.
- darkpuma 7y agoIt's case insensitive, you can use lowercase if you like. The reason the UPPERCASE persists is frankly because most people like it that way. Or maybe I'm wrong about that and we're one preference cascade away from a major flip in public opinion. But personally, I rebelled against the UPPERCASE when I was first learning it, but I've since come to find the UPPERCASE to be quite comforting. I think it has a pleasing aesthetic quality, and I find it helps make large chunks of SQL less intimidating to read.
- int_19h 7y agoI think the main reason these days is that there's still a fair bit of SQL embedded in other languages, usually as string literals with placeholders. And then it provides a way to visually distinguish it from "normal" string literals.
- max76 7y agoI would very interested in a language that transcribes to SQL the same way typescript transcribes to javascript.
- PLenz 7y agoThat's more or less what ORMs try to be.
- Koshkin 7y agoOnly in the manner of speaking (i.e. if you conflate 'mapping' with 'transcribing').
- remus 7y agoIf the generated SQL was compatible across a variety of databases and the performance of the SQL was also passable you'd be on to a good thing.
- max76 7y agoThis is a problem I've been thinking about for years. It's possible to write pure ANSI SQL and be compatible across a lot of databases, but to be optimized in different databases it would need to have a target platform to compile to. I'm really interested in what other developers think about this.
- im3w1l 7y agoA simple thing would be macros for subqueries A := select col_1, col_2, col_3 from table_1 B := select col_4, col_5, col_6 from table_2 where 2*col_5 > col_4 + col_6 $A left join $B on table_1.col_1 = table_2.col_5
- darkpuma 7y agoSaying you can do better than SQL is an extraordinarily bold claim, considering SQL is one of the most successful programming languages in human history and certainly the most successful fourth-generation programming language. Wide swaths of people you might ordinarily think of as non-programmers know how to use SQL in meaningful ways. Doing better is certainly possible, but SQL is much better than a lot of people give it credit for.
- asdkhadsj 7y agoI like the fact that this is built on Postgres. Will be curious to give it a try on the side.
- 6gvONxR4sf7o 7y agoI always wished SQL had a better handle on sum types. If I have a user whose favorite story is an instance of Either[Movie, Book], then it's already a pain to deal with in a nice simple way. And that's as simple as sum types get.
- RedCrowbar 7y agoYou can do that in EdgeDB: type Movie { property director -> str }; type Book { property author -> str }; type User { multi link favorites -> Movie | Book }; SELECT User { favorites: { [IS Movie].director, [IS Book].author, } };
- 6gvONxR4sf7o 7y agoCan you tell me whether I'm understanding this correctly? Would this query result in, e.g. [(director: Null, author: J.K Rowling), (director: Spielberg, Null), ...] or would it be [author: J.K. Rowling, director: Spielberg, ...] or just plain strings: [J.K. Rowling, Spielberg, ...]? I still don't totally get the model here.
- RedCrowbar 7y agoIf fetched as JSON: {"favories": [{"director": null, "author": "J.K Rowling"}, {"director": "Spielberg", "author": null}, ...]} You can also query the actual object type by referring to the __type__ link: SELECT User { favorites: { __type__, [IS Movie].director, [IS Book].author, } };
- 6gvONxR4sf7o 7y agoThanks for the clarification! Seems really cool :)
- tlarkworthy 7y agoThat is an acute observation and something I might consider dumping SQL for, or rather, I feel SQL could be upgraded to include
- z3t4 7y agoSQL is an incredible language. I don't think we can do better, only different. It's not that common to mix two programming languages like you mix SQL and application code. For example having your app code in JavaScript then write SQL queries to access the data feels unfashionable. Polling also seem like something from the 80's. RethinkDb was a step in the right direction, but I think the mistake was to invent another query language, instead of making the database querying seamlessly integrated to programming languages. It should be possible to write observables without having to context switch back and forth between data querying and app logic. I'm a "full stack" developer/speaker, and for a long time I useed English on the front-end, German on the back-end, and Spanish for talking to the databaste. When I switched to English on the back-end I saw an productivity boost and I got better at and started to like English more. But I still talk Spanish with the database. I could probably be more efficient using English to talk to everything. I would probably still use French for design though.
- beagle3 7y agoThere have been tens of attempts over the years - a Dutch one called Xplain was quite good IIRC. But they all suffer from delivering too little extra (if fully adopted) against the incumbent. Unfortunately, SQL is good enough for the majority of users and uses.
- jpobst 7y agoMany comments (probably correctly) point out that SQL can't be displaced because it is ubiquitous and "good enough". I wonder if there is room for a "TypeScript" of SQL that would allow developers to opt-in to whatever new language features or paradigms we feel SQL is missing. It would then transpile down to regular SQL to be executed.
- Svip 7y agoI was wondering the same thing. Why not rather than build a new database engine, write a library like an ORM that transpiles a language - like EdgeQL - to SQL, so you can attempt to use it, without switching underlying database engine, and still use your old SQL code?
- RedCrowbar 7y agoEdgeDB is built on Postgres, it's not from scratch.
- deleted 7y ago[deleted]
- rockostrich 7y agoIsn't this what an ORM is? Or at least an ORM covers some new features that users can opt-in to without losing the ability to write raw SQL. I guess it's not the perfect analogy to TypeScript, but I think it's a pretty good comparison. The other thing I can think of are things like GraphQL which can be used as an abstraction on top of a SQL DB.
- ben509 7y agoSome ORMs like Hibernate have their own QL, but they typically preserve the SQL data model. This isn't just replacing SQL, they're trying to implement a new data model that is backed by Postgres.
- wendyshu 7y agoYeah then we get the best of both worlds. I might use that if it existed. All else being equal, EdgeQL the language looks great compared to SQL.
- tschellenbach 7y agoIt's like SQL, but different. About as hard to learn, not fully developed and incompatible with years of tooling in the ecosystem.
- lmkg 7y agoThis critique reminds me of Dart: A better JavaScript, that wasn't better-enough to be worth the transition. I have the same concerns about the proposed language. Yes it's better, but is that enough? What's going to drive adoption?
- izolate 7y agoDart was better enough, as evidenced by the recent uptick of Typescript. Had it been released in 2019, I could envision a different story.
- rhizome 7y agoYou sound skeptical about the daydreams of a bored CS graduate.
- JackFr 7y agoIf the language is the problem, why write a new server? Transpile your language to the equivalent SQL, and rely on decades of research and real world experience in things like replication, optimization, locking strategies, high availability, security etc. the things unrelated to the language current SQL databases are really good at. Enterprises need enterprisey features.
- 1st1 7y agoThis is exactly what we do. EdgeDB is based on PostgreSQL.
- PeCaN 7y agoI know CompanyDB is the new company.com but I feel this would all be a bit more clear if you just called the company EdgeQL.
- davidw 7y agoWhich version, and how easy is it for you to track the 'latest and greatest' Postgres version, as they come out?
- 1st1 7y agoLatest stable and we'll keep it that way.
- lixtra 7y agoAnd do you support other backends as well (i.e. MySQL?). Does EdgeDB still offer a regular SQL interface because people need time to migrate. Even if I was convinced EQL was the future I wouldn’t throw out the old stuff. If the old stuff continues working but there is a smooth migration path, I would probably give it a try. Think of TypeScript vs. JavaScript.
- 1st1 7y ago> And do you support other backends as well (i.e. MySQL?). Does EdgeDB still offer a regular SQL interface because people need time to migrate. No, but we have a few ideas on how to connect existing databases to EdgeDB. > Even if I was convinced EQL was the future I wouldn’t throw out the old stuff. If the old stuff continues working but there is a smooth migration path, I would probably give it a try. Yes, we'll be working on that.
- brightball 7y agoI don't disagree that SQL can be improved. It's one of the biggest reasons I use Postgres in the first place because there are so many improvements available on top of SQL. All that said...SQL is pretty darn effective. As a language, it's the true backbone of the internet today. It's readable, explicit, fairly concise and naturally translates to how data should be broken down for efficient storage...or make some trade-offs to allow for more efficient retrieval. There are differences with different vendor implementations...but that's what different vendors are for - to find things the other guys are doing wrong and improving on them to build a better product. I wish the folks luck in their work to improve things, but the language I've been able to rely on consistently over the last 17 years or so has been SQL...and I've worked with a lot of languages. SQL is the one that gets the most done reliably and lets me down the least often.
- tathougies 7y ago> I use Postgres in the first place because there are so many improvements available on top of SQL. Most of Postgres is standard SQL. It's just that most non-Postgres databases do not implement standard SQL very well.
- inferiorhuman 7y agoMost of Postgres is standard SQL. It's just that most non-Postgres databases do not implement standard SQL very well. Sure, but the non-standard enhancements like JSON support are part of what sets Postgres apart from the competition IMO.
- jade12 7y agoDoesn't every major RDBMS support JSON out of the box these days?
- zaarn 7y ago(Last I checked atleast) JSON isn't as well supported on MySQl or MSSQL compared to PG. In PG, a JSON column is so well integrated that you can do all sorts of crazy stuff (indices over JSON queries is my favorite). You could build an entire RDBMS on top of PG's JSON column.
- taffer 7y agoHow many of the PostgreSQL features does edgedb support?
- 1st1 7y agoQuite a big number, but probably not all yet. For example, in one of the future releases we'll add support for GIS types.
- blaisio 7y agoWe can do so much better! The problem really is, even if you have a nicer more expressive language that cross-compiles to SQL, it's really easy to end up with things that are impossible write in some databases. Even though SQL is based on Math, so it should "just work", the syntax is badly designed, and it is tied up with database consistency models, so it is easy to write something that should be possible but isn't. We can probably make much better compromises in a different language, but it is unclear how we could efficiently do backwards compatibility given all the existing databases and database clients.
- gigatexal 7y agoMore vendors just need to support ANSI SQL.
- pjungwir 7y agoI like a SQL a lot, but I wouldn't mind a nicer interface to a relational database. TutorialD seems more elegant and expressive than EdgeQL though. If I were designing a new query language, that's where I would look for inspiration. Anyway I'm glad to see people experimenting! I am waiting for someone to write a paper titled "SQL NULL is (nearly) a Monad." It is "contagious" just like mapping over None. Sometimes I think it'd be cool to add Maybe<T> columns to Postgres, where operators would do the right thing for Some(x) vs None, but then I think, "Wait, that's how it already works!" At least it is very close. But one way or another I would love to see a re-assessment of SQL NULL from the perspective of category theory. If we could redo NULLs as Maybe types, what would that improve? Incidentally, Leonid Lybkin published a really cool paper in 2014 about handling NULLs with category-theory ideas, but it is more about drawing inferences from incomplete premises ("Incomplete data: what went wrong and how to fix it"). Maybe he'll write something about Maybe column types too. :-) Also if you are interested in improving relational databases, Codd's 1979 paper "Extending the Database Relational Model to Capture More Meaning" is super interesting. The first part is where he adds NULLs (in order to add OUTER JOINs basically), but the second part is almost never mentioned and gives a way to query the schema itself as part of a database query. It looks a lot like doing graph database queries from your relational db. Also a better kind of EAV pattern. Also more support for OO-style inheritance. Somehow 40 years later it is still way more advanced than any existing RDBMS. It would totally break the parse-plan-execute pipeline of today's systems, but it is fascinating to think about. I wish more people would read this paper before trying to go "beyond relational"!
- 1st1 7y agoActually quite a lot of people told us they thought EdgeQL was inspired by Tutorial D :) Have you had a chance to actually try to play with EdegQL?
- wisnesky 7y agoCheck out http://categoricaldata.net http://categoricaldata.net for a categorical approach to database theory that uses a labeled null semantics from type theory.
- asdkhadsj 7y agoSidenote, has anyone seen how to actually talk to EdgeDB languages without a Client? As it seems currently only Python has a client. (edit: I'm specifically wondering about Rust, if it matters)
- 1st1 7y agoJavaScript and Go clients are coming soon. Java/Rust will follow.
- RedCrowbar 7y agoThere's also HTTP/JSON support.
- asdkhadsj 7y agoHah, that should have been in the first answer. With no Rust client, I almost ignored the DB until there was a Rust client. If it has full HTTP/JSON support then I could still use it. Any links to the HTTP-JSON API documentation? I've not found it thus far. (edit: I hope it's a fully featured API, and not the GraphAPI haha)
- beefield 7y agoNot sure if there is something wrong in my brain but I have not been able to understand the hate against NULL. To me the three value logic feels very natural and just clicks. Lately I have been dipping my toes into Alteryx, which treats empty values in a way that definitely does not correspond to 'normal' NULL logic in databases and it feels very much like a constraint on building my workflows.
- vpetrovykh 7y agoIf a NULL were just a value in 3-valued logic, it could have been OK. However, that's not how it works out. Consider the following (that should be equivalent if NULL is just like Maybe in True-Maybe-False logic): SELECT null AND true; SELECT bool_and(column1) FROM (VALUES (null::bool),(true)) AS foo; In PostgreSQL the first query produces NULL, while the second produces TRUE. Yet, it's also possible to get NULL as a result of aggregating values with bool_and: SELECT bool_and(column1) FROM (VALUES (null::bool),(null::bool)) AS foo; And that's not how a 3-valued logic works.
- MarkusWinand 7y agoYou are mixing two concepts here: 3VL and how most aggregates work in SQL: the drop NULL values before doing their work. That's why the first BOOL_AND example only sees one value, thus returning true.
- beart 7y agoThe one small thing I've often wished for is to place the from clause before the select clause. Having to type out the columns before the table means auto completion never works well.
- geuszb 7y agoIt's kind of funny to point out issues with SQL's composability, and in the same breath spec out a language in which "a set (including an empty one) cannot be an element of another set". There are many real life problems with SQL but this doesn't feel like it's resolving any of them.
- haolez 7y agoI acknowledge the problems with SQL that the author stated, but I still prefer SQL over the alternative presented. What would be other alternatives to a declarative language like SQL? Prolog?
- esfandia 7y agoDatalog indeed is a thing: https://en.wikipedia.org/wiki/Datalog https://en.wikipedia.org/wiki/Datalog
- ErwinSmout 7y agoAny declarative language that does not commit the violations of the relational model that SQL does commit. Date&Darwen formally pinned down what such a language has to look like in their three subsequent editions of "the third manifesto" (first edition roundabouts 1995). There are at least two fully operational systems that comply.
- peterwwillis 7y agoSo, to fix SQL, they're taking an SQL server and building a proprietary language on top of it.
- brianpgordon 7y agoI have no background in databases so this may be naive or wrong, but the single biggest pain point in SQL that comes to my mind is that it can be difficult to tell what a query is doing without also knowing the constraints on the tables involved. Here's a real-life (ish) example from work: We have some_table which we want to join to other_table, but we need to map an identifier through mapping_table in order to do it. So we end up with a query like: SELECT (...) FROM some_table INNER JOIN mapping_table ON (...) INNER JOIN other_table ON (...) ...; I know for sure when writing this query that the middle join to mapping_table will map every some_table row to exactly one row (no more, no fewer) in mapping_table. The problem is that the query doesn't capture this. The mapping table isn't really named something as obvious as "mapping_table" so someone reading the query has a hard time inferring what the intent was. It totally changes how you mentally parse and think about the query if the result set can be accumulating multiple matching rows from the join, or maybe even losing rows if there are no matches. You have to go bring up your database schema to figure this out. And, as a fan of static typing, I can't help but cringe at the possibility of someone changing the constraints on the table without realizing that there are queries which implicitly depend on the old ones. SQL offers no resilience to this and will happily change the meaning of your query without a peep of complaint if you drop that constraint from mapping_table. If there's a fancy way to capture this "mapping" relationship in standard SQL that doesn't just use a dumb inner join, I'd love to know about it. If not, I'd love a query language that supports some annotations that help reading and are either stripped out before sending to the database engine, or are actually checked at runtime.
- tda 7y agoIf I understand correctly you are describing a one to one or one to many relationship. The canonical way to express that is 'don't use a mapping table'. Mapping tables are for many to many relationships. So why is there a mapping table in you example, and could you just get rid of it altogether?
- brianpgordon 7y agoIn this case it's tying together data from different, independent systems. So the schema may not be textbook ideal but I don't think there's any way around it.
- davidw 7y agoI like the groupwise maximum query...I always have to look that one up if I haven't done one in a while.
- jb3689 7y agoMy real issue with SQL is how verbose it is. The amount of relative importance to the number of characters in SQL is often pretty poor (for example, when doing multi-table joins). Having to spend a few minutes deciphering each SQL query is a real pain
- jshowa3 7y agoWe can do better than saying everything always needs to be "better".
- znpy 7y agoMeh. It looks like just another graph database with a (possibly) better query language. People of HN: if you really want to make money, make a open source (open core or whatever) horizontally scalable version of Versant OODBMS (Object-Oriented DBMS).
- ldb 7y agoHow do I test for empty set? If I understand correctly then "SELECT * FROM Movies WHERE description = {};" will not work, right?
- 1st1 7y agoYou can use the EXISTS operator: https://edgedb.com/docs/edgeql/funcops/set#operator::EXISTS https://edgedb.com/docs/edgeql/funcops/set#operator::EXISTS
- cletus 7y agoYeah I'm not sold. One example from this post that struck me was the author wanted to embed a select in a table expression. I'm not a fan of this at all. I don't want it not to be clear if a given expression list will explode in values or not. I like the fact that SQL has a solid foundation in relational algebra. I see no such foundation for the alternative. I do like what LINQ did here (being SQLish), which was to put the FROM clauses first. Some SQL variants have WITH clauses that are quite convenient but you end up with: WITH (...) AS a, (...) AS b SELECT a.a1, b.b1 FROM a JOIN b ON a.a = b.b Common alternative: SELECT a.a1, b.b1 FROM (...) a JOIN (...) b ON a.a = b.b whereas I'd prefer: FROM (...) a JOIN (...) b ON a.a = b.b SELECT a.a1, b.b1
- dragonwriter 7y ago> Some SQL variants have WITH clauses “Some variants”, including standard SQL since SQL:1999.
- MarkusWinand 7y agoWITH is supported by all major SQL brands in the meanwhile. https://modern-sql.com/feature/with#compatibility https://modern-sql.com/feature/with#compatibility
- latch 7y agoDoes the spec have any execution requirements re WITH? Pretty sure `WITH` in postgresql is gated and thus can have considerable performance implication vs a nested query (or none at all depending on the query).
- trollied 7y agoExecution is down to the RDBMS. Postgres is changing in the next release, BTW: https://www.depesz.com/2019/02/19/waiting-for-postgresql-12-allow-user-control-of-cte-materialization-and-change-the-default-behavior/ https://www.depesz.com/2019/02/19/waiting-for-postgresql-12-...
- ben509 7y ago> In situations where EdgeDB cannot infer the type of an empty set [2] Why not bottom, or are containers not covariant? I'm worried that we're not clear about the difference between variables and values. > Strictly speaking, EdgeQL sets are multisets [1] Like nulls, this is another broken aspects of SQL. Maybe you can address these concerns, but I'm skeptical that it's relational: * It conflates types with relation variables * It's using links rather than foreign key constraints * It doesn't seem like the user can even specify a candidate key * Which is why the "id" field is magical and special * Constraints only seem to apply to scalars The reason SQL has been successful is that tables are dead simple to understand, and you're throwing that out. This feels more like a graph database. [1]: https://edgedb.com/docs/edgeql/overview#type-system https://edgedb.com/docs/edgeql/overview#type-system [2]: https://edgedb.com/docs/edgeql/expressions/overview#set-constructor https://edgedb.com/docs/edgeql/expressions/overview#set-cons...
- RedCrowbar 7y ago>> Why not bottom, or are containers not covariant? I'm worried that we're not clear about the difference between variables and values. Yes, `{}` is inferred as `anytype`, but we chose to restrict its use in output for interoperability reasons: the output of a query must be of a concrete, known type. >> Strictly speaking, EdgeQL sets are multisets [1] > Like nulls, this is another broken aspects of SQL. From the purity standpoint, yes, but in practice, duplicate values are either expected, or too expensive to eliminate. That said there is a `DISTINCT` [1] aggregate. > * It conflates types with relation variables Not exactly. We do use the same symbol to denote a type, and a relation that it represents, but the context of which is which is always clear (i.e. Foo in a cast expression is always a type), but Foo in a regular expression is always a relvar. > * It's using links rather than foreign key constraints Links are an abstraction over a foreign key. In the vast majority of cases foreign keys are implemented as 'some_id' -> 'id' anyway. If you want a custom foreign key, you can set an expression constraint on a property or a link. > * It doesn't seem like the user can even specify a candidate key type Foo { constraint exclusive on ((.name, .last_name)) } > * Which is why the "id" field is magical and special See RM proscription 15 in the Third Manifesto [2] > * Constraints only seem to apply to scalars They aren't, see above. [1] https://edgedb.com/docs/edgeql/funcops/set#operator::DISTINCT https://edgedb.com/docs/edgeql/funcops/set#operator::DISTINC... [2] https://www.dcs.warwick.ac.uk/~hugh/TTM/DTATRM.pdf https://www.dcs.warwick.ac.uk/~hugh/TTM/DTATRM.pdf
- eanzenberg 7y agoHaha, hahahaha, hahaha. >>SELECT math::mean( Movie { description, number_of_reviews := count(.reviews) }.number_of_reviews ); I'm sorry, are you trying to make it more readable? Hahahahaha
- sctb 7y ago> Please don't post shallow dismissals, especially of other people's work. A good critical comment teaches us something. https://news.ycombinator.com/newsguidelines.html https://news.ycombinator.com/newsguidelines.html
- starpilot 7y agoIf there was a perfect, seamless pandas to SQL translator, that would be it.
- garmaine 7y agoWhy not Datalog? It would seem to meet all your constraints, and is well-studied.
- Vaslo 7y agoWith due respect, Datalog is a very difficult language to learn, and it just doesn't have the support and resources SQL does. We were forced to use it in a Data Cleaning course a few years ago because the professor was big on it, and everyone struggled. To this day, fellow students complain about that part of the course. No one ever looked at it again after that class. Datalog will ALWAYS be a niche language, because it is designed for a certain type of computational mind. The vast majority will want to learn SQL due to its ease despite any shortcomings it may have.
- bgorman 7y agoI have heard nothing but good things about learndatalogtoday.com Datalog suffers from some of the same problems that SQL does (different dialects). It does seem to me that Datomic and Datascript have the most intuitive syntax.
- garmaine 7y agoIs the difficulty you had due to it being a functional language? Or something more intrinsic to the language itself?
- Vaslo 7y agoMuch of it was writing code akin to recursive SQL (which was touted as one of the things it was way better than SQL at). Just never could understand it, and it took hours for most to get simple recursive models like connecting family trees. That language (like many) has a lot of work to do in terms of support and tutorials in order to build reasonable interest for it.
- garmaine 7y agoI think the problem here is is institutional--both our teaching institutions and normal industrial practices. Objective studies have shown repeatedly that functional programming models (which emphasize recursion, a stumbling block you mention) are easier for students with no prior programming knowledge to pick up and use effectively. It also tends to make better programmers, more quickly. There's a reason MIT taught Lisp/Scheme in its introductory computer science course for so many decades. However (1) once you've ingrained all the counter-proactive habits of thinking and worked past the stumbling blocks that imperative and object-oriented programming models present, the conceptual jump from that to SQL is smaller; and (2) good, in-depth introductory materials don't materialize out of nowhere without demand. Your instructor was probably trying to do something good, both by introducing you to data processing in a language with fewer syntactical hurdles and in year-by-year incrementally improving the quality of introductory material by using it in instruction. Datalog allows you to express data relationships in a more straight forward, more compact, and easier to refactor way free of most boilerplate. It does, however, require you think about what you want to accomplish abstractly, rather than as an imperative process, which is difficult merely because of the years of experience the typical student already has in unergonomic languages like C++, Java, etc.
- coleifer 7y agoAnd thus a new SQL dialect was born.
- ken 7y agoThis article misses the single biggest failing of SQL, in my mind: that it's not a language. It's a family of incompatible languages, with similar syntax -- like "Lisp". I can't write a program that works against 'any database', because switching databases means a lot of extra custom work. That means databases can't easily compete against each other. (Oracle's license terms sure don't help.) That's terrible. It's worse than x86/PPC/ARM -- at least with CPUs, a compiler can generate machine code for any of them, coming from the same source code.
- 1st1 7y agoExactly. The situation is even worse because many libraries support only "common ground of SQL" and therefore underutilize the real capabilities of the database. We mentioned that there are "many SQLs" in this blog post, but not in this specific context.
- ris 7y agoYour point seems a little like tilting at windmills to me. Different databases written by different entities who didn't have a huge incentive to strictly conform to each others syntax varied in their implementations. This is just life. > It's worse than x86/PPC/ARM You're... saying that there should only be one CPU architecture too?
- ken 7y ago> This is just life. Market forces naturally explain what we have today, therefore ... I'm Don Quixote. Sure, I'll accept the title. Likewise, I could say: if you don't like reading complaints like this, blog posts and internet comments might not be for you. :-) > You're... saying that there should only be one CPU architecture too? No. I'm saying that the analogous situation with CPU architectures was observed 50 years ago, and despite causing inefficiencies (especially at first), we've spent the effort to create abstractions to gradually make it easier to describe systems at a higher level. It generally doesn't matter, to either users or developers, that there are multiple CPU architectures. We still have many programming languages, too. Databases have gone in the opposite direction: while adding features over the years, even when these features are 99.9% functionally identical between vendors, they've picked different syntax and data types. Even though they all speak "SQL", databases are more incompatible today than ever. I guess what I'm getting at is: it's a good thing that compilers were invented before all software needed an ROI, and it's a shame databases didn't get the same treatment before corporate interests took over.
- ldb 7y ago> any element-wise operation on an empty set is, likewise, an empty set Does this mean that "SELECT 1 + {}" gives "{}"?
- RedCrowbar 7y agoCorrect.
- ldb 7y agoAssume I have a table "Actors" with a column "age" and for some of the records the age is not set (an empty set). Does this mean that "SELECT SUM(age) FROM Actors;" gives "{}" or do you implement a special logic for empty-set summation when used in connection with aggregation (like SQL does)?
- RedCrowbar 7y agoAggregate functions in EdgeDB have an "initial value", which, for `sum()` is defined as zero. Other aggregates, like `avg()` are not defined for empty sets (you cannot divide by 0), so an error is thrown in this case.
- ldb 7y agoI am still a bit unclear about this. Assume we have three actor records where two records have age=30 and for the remaining one the age is not set. From what I understand then "SELECT sum(age) FROM Actor;" returns "60" while "SELECT 30 + 30 + {}" returns "{}". This appears to be an inconsistent handling of empty sets (thought it would be the same as in SQL).
- RedCrowbar 7y agoThe difference is that `+` is defined as a strict function (returns empty on empty input): plus(a, b), whereas sum() is an aggregate that is specifically defined as 0 on empty input.
- 7y ago
- londondev45 7y agoI fundamentally disagree with this article. SQL is arguably the most important language in a developers toolbox. The attempts to isolate and replace it's complexity through ORMs and nosql implementations has never resulted in a viable replacement. Like mathematical syntax fits mathematical logic. So SQL matches data retrieval. Let's stop trying to replace it just because it's old. SQL is amazing.
- cmrdporcupine 7y agoI'm not sure you read the article? The author lays out a number of ways in which SQL itself does not match the relational data model well, and gets in the way of doing data retrieval well. His criticisms are nothing new. Relational "gurus" Date, Codd, Darwin, Fabian Pascal all made similar criticisms of SQL over the last 30 years.
- just_myles 7y agoThat's a pass for me for now. I think it's current state is fairly easy to pick up. Should this somehow be highly a adopted and truly show a benefit over the standard, I still might pass :)
- RocketSyntax 7y agoI use ORMs
- lowken10 7y agoI disagree with the article, however it is important that we challenge our assumptions. If someone can show me something better than SQL then I'm all ears.
- jimnotgym 7y agoWe Can Do Better Than English. It is full of strange grammar and inconsistencies. The tooling for checking grammar throws false positives. In fact all it has going for it is that billions of people already speak it...well I suppose that is a pretty big advantage.
- dicroce 7y agoI'm fine with SQL, but i would also like there to be a more explicit language that requires you to invoke the indexes when querying explicitly (instead of implicitly like SQL). If you attempted to use an index that didn't exist the query would simply fail (instead of just run slowly).
- troels 7y agoSome dialects allow you to hint to what index to use.
- krick 7y agoI wholeheartedly agree with the "complaining" part of the post, but then here comes the "solution" and I'm not quite sold. I mean, I don't necessarily claim that this is not a solution, it just isn't obvious to me at all. Maybe a more extensive explanation with better examples would make it all clear to me and I'd be super-hyped about it already, but right now I'm more like confused. First off, it would be helpful show the table structure in the examples, and then compare EdgeQL query to the easiest solution in the SQL. After all, the readers supposedly use SQL almost daily for many years (I know I do), but don't know a thing about EdgeQL, so if it can do everything SQL can, but easier, such a comparison must make it pretty obvious. TBH, my knowledge of the relational algebra is quite rusty by now, so maybe that's the problem, but as I remember, many queries we commonly use with the SQL are not really "relational" queries. Relational algebra deals with the sets of tuples, so things like count(*) or ORDER BY, or GROUP BY are not really a part of relational model, they just exist because they are super-helpful in what we usually are trying to achieve with SQL. The problems with NULL are of a similar nature. I don't think we should pretend that NULL not being equal NULL is not useful (we don't expect "missing data" to be exactly the same value as another "missing data", do we?), and SELECT DISTINCT treating them as equals is not intuitive (for me it absolutely is: when I'm asking what values occur in a table, a missing entry is a missing entry to me, I don't want to see NULL 10000 times). So, the introduction kind of made me to expect the solution to be more in compliance with relational concepts, but it doesn't seem to be, since all of the above are present in the EdgeQL in one form or another. I'm not sure how {} is different from NULL in the EdgeQL, since {} seems to be kind of special thing here, the same as NULL is in the SQL. I mean, it doesn't behave like a true empty set at all! Non-empty set {value} OR {} = {value}, not {} (OR ≡ ∪). <bool>{} being {} instead of a true boolean value looks even more confusing to me than NULL OR (NOT NULL) = NULL. Same ternary algebra here. Then, I don't really understand a concept of a flat set here. I do kind of understand what we are trying to achieve here: we want to solve the problem of SELECT x, (SELECT y) FROM z throwing an error in a runtime, if count(SELECT y) != 1. And it kind of would make sense in SQL, but it's explicitly advertised as a feature of EdgeQL that it can return trees (json-like structures), and here it doesn't seem to make sense that an output of a query (which is a "flat set", I guess?) cannot have another set as an element. Moreover, it obviusly can be ordered, which also isn't a property of how "set" is commonly defined in the set theory. As a first impression, syntax and overall structure of the queries doesn't strike me as obvious as well. In fact, since > SQL does not integrate well enough with application languages and protocols I would ultimately hope for something that can be expressed as a number of function calls and commonly used data structures (a list, a dictionary/record, etc.) in most/any mainstream PLs, not a one more DSL as in "free form text". (Maybe with a more succinct DSL for the use in a console. Maybe.) And my ultimate source of confusion. SQL is more or less the same thing even in these DBMS where it isn't exactly The SQL (like ClickHouse). And given I know the overall structure of the DBMS (like, is it, for instance, row-based or column-based?) I can make pretty good assumptions of performance of a given query, even though SQL is still declarative and I do not know what exactly the query-optimizer will do. Maybe it's just that I'm not used to it, but I don't have a feel about how performant would be the last EdgeQL example of the article, and if it would be better to separate it into several queries at some scale. In fact, I don't even understand if it's something that would be reasonable easy to implement in other major RDBMS', or is it ultimately EdgeDB-only feature? If so, it can be only as good as EdgeDB — and is it as good as PosgreSQL, or MariaDB, or sqlite? Unfortunately, in the real world I have to worry more about how performant and robust a thing is under load, than I can worry about programming convenience.
- NeoBasilisk 7y ago"We can do better than SQL." I heard this not too many years ago, and I am now very skeptical based upon those results.
- dragonwriter 7y agoSince Date’s criticism of SQL is prominently referenced, the natural question is “Is EdgeDB a D, and, if not, why not?” (D referring to the class of relational systems for which Date and Darwen provided criteria.)
- RedCrowbar 7y agoEdgeDB is not quite D if you read all the proscriptions to the letter, but it's very close :-)
- ChicagoDave 7y agoI’ve been arguing relational databases are an operational anti-pattern for a few years. Your architecture shouldn’t start with an implementation choice. It should start with business modeling and drive down to tech choices, which may be one of many types of serialization/data storage technology. Adopters of Domain-Driven Design have already moved past this argument.
- keithnz 7y agoAmazing how our history of programming has so many things putting layers over SQL. I think mainly because the bridge between SQL and General Programming is often not too pretty ( string based queries with no validation ). But in my experience, it's often better to just embrace SQL. I won't argue the syntax is nice, but it is conceptually nice. Usually the further away you get from queries on relational databases, the more often you do things very inefficiently from a database point of view, to the point of being orders of magnitude worse.
- pbiswal 7y agoHi - a lot of commenters have valid concerns and critiques, but I joined HN after lurking for years to say that I really like the direction you’ve taken! I’m particularly happy about the convenient syntax for joined inserts and sum types. I see that you’ve built this as a patched version of Postgres, but I’m curious how much of this syntax you could implement as a client library and shell that would run against an existing Postgres instance. Right away, you would get adoption from people who have an existing Postgres, or who want to take advantage of SaaS offerings like AWS Aurora. Longer term, I could imagine the client/shell being extended to support multiple backend DB dialects, even things like Spark or Redshift which you’d have a hard time modifying intrusively. It could also be cool to explore interoperation with existing schemas written in plain SQL, so people could adopt it incrementally that way.
- 1st1 7y agoThank you for your comment, it aligns pretty well with our current thinking about this. > It could also be cool to explore interoperation with existing schemas written in plain SQL, so people could adopt it incrementally that way. Yes, this will happen too.
- iblaine 7y agoAcademically, EdgeDB is very interesting, but practically, it seems to be solving a problem that does not exist. SQL is great for simple set operations and will lose its efficiency as you move towards more advanced features. The industry has accepted SQLs limitations and created new ways to interface with data, such as UDFs, pig, and pyspark. Those widely accepted alternatives can save you from doing something in SQL that you really shouldn't be doing in the first place.
- oarabbus_ 7y ago>The questions we often hear are “Why create a new query language?” and “What’s wrong with SQL?”. This post contains answers to both. Ah, I can already tell I'm not going to like this article. >lack of proper orthogonality — SQL is hard to compose; Their reasoning: "The difference in structure is large enough to make any sort of source-level query reuse impractical." This is blatantly false. The second example in the article using the join covers both the single-row and multi-row result cases. Additionally, SQL can be made very reusable and modular using tools like DBT, or within a DB using views or other constructs. >lack of compactness — SQL is a large language; It's certainly smaller in the keyword set than almost any other computer language I have used. This is like saying "It's a very cold day in the Sahara desert" when the temperature is 40C/105F. >lack of consistency — SQL is inconsistent in syntax and semantics; Is it? Or do people take liberties with their implementations? There is an SQL Standard and Postgres is compliant to it. Other databases not being fully ANSI SQL compliant is the fault of the DB creators, not the fault of SQL. >poor system cohesion — SQL does not integrate well enough with application languages and protocols. It is a relational language designed to be used within a relational database. Do the authors also complain that their screwdrivers are very inefficient at cutting meat? They're onto something with the trickiness of NULL, but there have already been tons and tons of discussions on Hacker News - anyone with database experience, either analytical or transaction, will tell you that imagining a NULL-free world actually creates more problems then it solves. I found this to be a highly misinformed article, personally; really it's a marketing ploy for their proprietary language. Just like most other "we have our own query language better than SQL" product, it probably isn't.
- iaabtpbtpnn 7y agoAgreed on most points, but not the keywords. SQL has hundreds of keywords.
- oarabbus_ 7y agoAh, you're correct. From the querying side, there's a couple dozen that you need to know. Different personas would only need to know a small subset but it's certainly true the list of keywords itself is large.
- ares2012 7y agoI'm disappointed they left QBE (https://en.wikipedia.org/wiki/Query_by_Example https://en.wikipedia.org/wiki/Query_by_Example) out of their history of SQL and relations. SQL vs QBE is one of the great examples of concise technology beating over-wrought UX.
- mamcx 7y agoYes. I think many here miss totally the point. Is the same mindset that lead to believe C, bash or unix are good(?) then why bother? I'm very lucky that I start with FoxPro, so I know what is to live with a MUCH better thing than SQL. To the point: - "SQL is standard, everywhere... why try to change or do something else?" I hope none here work in new software products. And also, try to replace ALL the OLD with the NEW is no the point, is to try to DO BETTER THAN THE OLD. I suspect most of use are in that business... right? - "SQL is a good language!" Superficially, yes.. as good is javascript or C. More exactly to be the "default" option we are VERY lucky SQL is not alike C or JS. But "good" is not. Is adecuate. IF you DON'T KNOW WHY then learn the why first. For us that LIVE in the RDBMS world is clear as water than SQL is not the ideal, is what we have. ---- Is important to understand that "SQL", Rdbms and the relational model are badly misunderstood (just look how the NoSql movement market itself!) - SQL IS NOT THE RELATIONAL MODEL, is BASED on it. The relational model is MORE expressive, powerful, flexible and EASIER than SQL. - SQL IS NOT RDBMS A much better APIs can be build on top a RDBMS but SQL is a poor language for that. This is part of why exist so many extensions. Think, for example, why you can't do SELECT key FROM BTreeInde_CustomerCode GROUP BY (whatever -- And I mean GROUP, not SUMMARIZE!) let city = SELECT name let filter = WHERE id = @id let query = city + filter(id=1) and many many other things like that Many things that get mixed with the "SQL" language are part of the implementation or capabilities of the RDBMS. - However, SQL IS A FINE EXAMPLE IN HOW DO DATA And in fact, is not that hard to imagine a much better version, SQL is not that far from a better option!
- tracer4201 7y agoI didn’t really understand your post other than a high level point that you believe SQL is insufficient. I’m not quite understanding the benefit of your example. I don’t personally want to write that style of syntax.
- mamcx 7y ago> you believe SQL is insufficient I don't believe it, is insufficient, as a fact. Compare let city = SELECT name let filter = WHERE id = @id to let city = map name let filter = filter(id = id) let query = city |> filter this is to show that SQL, despite being a programming language, can't compose well. The syntax is not the point. You can build full apps in forth or lisp (as examples of even more minimal Langs than SQL) but now consider the idea of build a full app in SQL. Without other language making the rest of their limitations.
- codetrotter 7y agoAs someone with experience in using PostgreSQL, but who found that it would fall short for a current project due to among other things the problems you refer to as “poor system cohesion”, I am intrigued by EdgeQL. Something I wonder though; can materialized views be created with EdgeQL? And if so, does updating materialized views still require fully rebuilding them, as PostgreSQL does, or can they be updated incrementally?
- RedCrowbar 7y agoAlas, we don't support matviews yet, but it's on the TODO list.
- slifin 7y agoDatalog appears to address a lot of these concerns
- alexnewman 7y agoThe critiques of SQL arent' wrong. I have written 4 parsers and can tell you the lack of orthogonality is a pain. Luckily we have the NIST compatibility guidelines to keep us safe. A replacement of SQL which contains the same compatibility tests would sell me on a new language, but it's really hard
- nicodjimenez 7y ago"We Can Do Better Than SQL", sure, but how much better? Fundamentally, SQL is a declarative language for databases, that makes the easy stuff easy, and the hard stuff doable. If people want to build new front ends for SQL databases, to make it easier to build apps, I can buy that. But trying to replace SQL as the standard declarative language for data is a fool's errand. You'd have better luck getting developers to switch away from git. People don't use SQL databases because they're fun for developers to hack on, they use them because they solve a business need. If you want to innovate in the database space, I think you need to provide something that benefits end users (global availability, auto scaling, speed, client syncing ala Firebase, ...).
- solidasparagus 7y ago> makes the easy stuff easy, and the hard stuff doable I like SQL, but I disagree. It also makes easy stuff hard. Given many numbers (billions), how would you find the 1st, 3rd and 5th highest values?
- dragonwriter 7y agoThe SQL to do this is simple and straightforward using analytic functions (specifically nth_value); the performance is likely to suck hard if you don't have an appropriate index, but that's not an SQL problem, but a “sorting billions of numbers is expensive” problem. SELECT nth_value(num, 1) OVER ORDER BY num, nth_value(num, 3) OVER ORDER BY num, nth_value(num, 5) OVER ORDER BY num FROM t
- im3w1l 7y agonth_value can be done in a faster way than sorting and picking. It can be done in O(n) while sorting is O(n log n).
- jeltz 7y agoWhich is why PostgreSQL uses heap sort with a fixed max heap size for sort with a small limit (called "top-N heapsort" when running explain analyze). Then the complexity for getting the kth value is O(n log k) which is O(n).
- zepearl 7y agoIn my opinion the example of the first chapter ("Lack of Orthogonality") is wrong. The subquery (is it called "inline subquery?)... > SELECT name FROM emp WHERE role = 'dept head' AND deptno = dept.no ...should in my opinion definitely return only 1 row for each department - from a logical point of view returning multiple rows would mean that the data is corrupt upstream or that the organization itself is corrupt or that there is a lack of attributes in the DB (if no additional selection criteria like for example "management" or "operations" or "deputee" etc... can be added to the query - meaning that no sub/organization can have more than 1 person responsible for the exact same thing). I admit that this is a very focused critic and that I'm very happy with the current behaviour of the generic SQL language and its special cases which are linked to the DB being used (using currently Oracle, MariaDB, Clickhouse - used DB2, Kudu through Cloudera stack, PostgreSQL, maybe something else) and how it stores/processes the data etc... .
- nixpulvis 7y agoI know, I've used AR.
- jeffdavis 7y agoThe {} construct seems awfully close to NULL. Not sure I understand the fundamental difference -- having a third value in boolean contexts still introduces 3VL. Why not just use an Option/Maybe type?
- RedCrowbar 7y agoEmpty set differs from NULL is that you get an empty set if you apply an element-wise function over it (which most operators and functions in EdgeQL are). > Why not just use an Option/Maybe type? We are considering adding algebraic types and a syntax to match them, but it ultimately boils down to taste and use case: SELECT value ?? "fallback in case of empty" is not fundamentally different from (hypothetical): SELECT MATCH value CASE Some(non_empty_val) THEN non_empty_val CASE Empty THEN "fallback in case of empty" END;
- jeffdavis 7y ago"Empty set differs from NULL is that you get an empty set if you apply an element-wise function over it" It still sounds like NULL -- I must be missing something.
- RedCrowbar 7y agoTake the CASE WHEN example from the blog. An equivalent EdgeQL expression is SELECT 'one' IF value = 1 ELSE 'not one' If value is an empty set, then the result is _always_ an empty set, unlike SQL that pretends NULL values are actually boolean for the purposes of the condition. EdgeQL expressions are, essentially, set comprehensions, the above is equivalent to this Python expression: {'one' if v = 1 else 'not one' for v in value}
- wisnesky 7y agoCategory theory can do better than relational database theory: the open-source categorical query language CQL extends SQL with generalizations of abstractions such as schema mappings and queries while supporting automated theorem proving and fixing foundational semantic issues such as null handling. http://categoricaldata.net http://categoricaldata.net
- stepbeek 7y agoThanks for linking to this. I think I've been trying to build a poor mans version of it in scala without realizing it...
- madhadron 7y agoThis is the wrong direction. Let's get the history in place first. The relational calculus set up a set of operators. That's what Codd worked with. It was combined with a natural language project at IBM which gave us the vaguely English like syntax of SQL. > In EdgeDB, the data schema is formulated in a way that is much closer to the contemporary application data model. ...Unlike SQL, EdgeQL can easily extract arbitrary data trees. This is a reinvention of the the hierarchical database, one of the architectures that was abandoned when the relational database came along. This was all fought out on a large scale in the 1980's. The fundamental idea that you have a highly structured data tree is what the relational model threw away. "Data Oriented Design"[^1] does a pretty good job of explaining why, but roughly: we're accustomed to programming where we have an object/entity/value that represents a conceptual "thing" in our discourse. We compose things into other things, subtype things, and otherwise deal in things. And this turns out to be a disaster when lots of people need to extend and reuse hunks of the same database. If you give up on things as first class parts of your data model, and only talk about relations among attributes, a lot of those problems go away. If you want to improve SQL, look at going back to the relational calculus without the natural language veneer. There have been a number of systems that tried that, though none have gotten real world traction. I'm also blanking on their names at the moment, so if someone who's memory is working better can help me, I would appreciate it. [^1]: http://www.dataorienteddesign.com/dodmain/ http://www.dataorienteddesign.com/dodmain/
- RedCrowbar 7y ago> This is a reinvention of the the hierarchical database It's not. Just because data can be fetched as a set of "tree-like" things does not make the model hierarchical in any way. But it makes lots of practical use cases easier. > The fundamental idea that you have a highly structured data tree is what the relational model threw away. And then ORMs came and reinstated the status quo. Truth is, many applications actually benefit from a highly structured data graph. That said, you don't have to use the "highly structured" bits of EdgeDB, it's perfectly fine if all your types are simple tuples. > We compose things into other things, subtype things, and otherwise deal in things. And this turns out to be a disaster when lots of people need to extend and reuse hunks of the same database. I would be very interested in reading about this. Do you have any references? Most cases of "disaster" in my experience had to do with extremely poorly defined and documented schemas that had barely any relation to the actual business model.
- leandrod 7y agoObject relational? No thanks. Just give me relational.
- chuckcode 7y agoBefore diving into ways that SQL could improve I'd like to give some thanks to a real workhorse that has proved useful over decades, which is an incredibly long time in tech. Could it be better? Sure, but author's proposal doesn't solve where I usually have problems. What are my pain points and what would I like to see instead? 1) One giant statement. Personally I really like Hadley Wickham's dplyr [1,2] (think "data pliers") which has a SQL like notion of joining different tables and selecting values but separates the filter, mutate and summarise verbs as separate steps in a pipeline rather than one huge statement. For transactions dplyr would have to add an update verb as well. 2) Hard to test, especially for more complex ETL. dplyr approach highlights that a lot of SQL these days is being used in ETL applications in addition to the usual retrieval, transactions and reporting. Being able to express as a pipeline of operations is easier for me to understand as execution is conceptually consecutive and I can unit test individual parts as part of a normal programming language environment. 3) My data isn't all tabular. Better support and semantics for non-scalar entries where value is a record itself like in json, BigQuery, Hive, Presto, etc. 4) Not that extendible. Better support for user defined operations (UDFs). More and more frequently I want to apply some non-trivial operation to data, e.g. run a machine learning model and it makes sense to do that as close as possible to the data usually. It is possible to do a fair bit in SQL itself with window functions but it is generally painful. You can point Hive at your jar and run a UDF but it is also painful to integrate and debug in my experience. [1] https://cran.r-project.org/web/packages/dplyr/vignettes/dplyr.html https://cran.r-project.org/web/packages/dplyr/vignettes/dply... [2] https://datacarpentry.org/R-genomics/04-dplyr.html https://datacarpentry.org/R-genomics/04-dplyr.html
- yelloweyes 7y agoWell then do it. Let me guess: ya can't.
- sanxchit 7y agoHaving worked with databases for a while, SQL seems to be useful because it forces you to think about how your data is structured. To me SQL is a thin wrapper around the relational algebra notation. The biggest problem I run into with SQL is that it is hard to tell how performant a complex query is before actually running it.
- danisth 7y agoNot a great interface, but estimated query plans can be pretty useful for getting a feel for how heavy a query will be.
- branko_d 7y agoMy two main gripes with SQL are: - Lack of interoperability with other languages. - General ugliness of server-side SQL (stored procedures and functions). -------- The first one isn't really solved by ORM tools, AFAICT. You can't simply write the SQL query and transpile it into a nice, statically-typed method (with types derived from the actual database structure!) that you can call directly from your language. For example, the database structure (I'm using T-SQL types here): CREATE TABLE T ( A int PRIMARY KEY, B bigint NOT NULL ); And the query (T-SQL style parameter syntax): SELECT A, B FROM T WHERE A = @a; Would produce the following method after transpilation (C#, hopefully self-explanatory): IEnumerable<(int A, long B)> Query(int a); But when the database structure changes, that would automatically be reflected in the client language (after a build). For example, making B NULL-abe would produce: IEnumerable<(int A, long? B)> Query(int a); -------- The second gripe is not very important if you use SQL just as a client-side query language. But making the database "defend" its data (in presence of complex business logic, or security requirements, not fully expressible through declarative constraints) is still best achieved by "funnelling" all clients through an API of stored procedures/functions/views, IMHO. As a bonus, this approach also tends to lower database round-trips. There seems to be a general lack of composability/reusability: - E.g. one stored procedure returning a set of rows cannot just "pipe" them into another procedure or query - it must first copy the rows into a (temporary) table. - If your dialect allows you to declare a table variable, you cannot just assign it to another, you have to INSERT. - You can reuse the same SQL fragment multiple times in the same query (through WITH), but not in different queries without encapsulating it in a function (and good luck with performance if your dialect doesn't inline function query plans or doesn't support functions at all). - You cannot parametrize ORDER BY, GROUP BY, IN... And myriad of other problems: - The syntax is stuck in the '80ties, not well suited for auto-completion, no type inference. - Lack of simple struct/tuple types in some dialects (may lead to huge parameter lists). - Inconsistent exception / error handling behavior (sometimes the transaction is aborted, sometimes it isn't). - Silent data truncation in some cases. - NULL sometimes meaning "unknown" and sometimes "empty". - No boolean expressions (e.g. you can't write A IS NULL = B IS NULL). - And probably many more that are currently not at the top of my head... <RANT CLOSED> It strikes me that we can do better on all these fronts (and more), without abandoning the "good" parts of relational databases.
- nickpeterson 7y agoHow about APL? (0=2|x)/x←⍳20 Visit rosettacode.org and try looking up some solutions in SQL and then reference the APL variant. It's night and day.
- yy77 7y agocriticism on SQL does not make it meaningful for a new database. I mean, an ORM with its own query language, a new SQL dialect, some language that compile to standard and optimized SQL are all good ideas.
- JaggerFoo 7y agoGood luck with that.
- systematical 7y agoI happen to like SQL and found it pretty easy to learn. Tons of resources out there. And now with Postgres ad MySQL adding JSON storage we're getting all the benefits of NoSQL in SQL.
- kerng 7y agoFrom all the languages I learned since high school, SQL is the one that is pretty much still the same. Agreed, it's not perfect but I think it's one of the most stable things there are. New features get added, which creates inconsistencies between dialects. But if you stick to basics, it's all still very much the same. In 2000s XML was added, then later JSON and there will be future support for other formats also to integrate new data types.
- ta1234567890 7y agoYou know what would be amazing to have for DB engines? Auto-optimization. For example, something that automatically determines which queries are slow and which indexes should be created to speed them up. Basically self-tuning. Not sure if this could be something for a machine learning model to do.
- MentallyRetired 7y agoSQL has been great. Relational data is greater. I absolutely hate working with graphQL, and document stores are a non-starter for projects with any decent amount of data.
- reilly3000 7y agoI’ll never understand why obvious marketing makes it to the front page, only to get shat upon by 95% of the comments. Of course we can do better than SQL. We could obviously do better than Javascript. It’s globally understood that we could all do better than English. We sometimes struggle to express ourselves with language. We can blame the language, try to fix it, or invent a new language and try to get people to speak it. I would rather spend my time refining my elocution than learn a new language. That said, there are words and phrases that simply work better in other languages. I don’t know a single-word corollary to ‘Simpatico’ in English. I wish the best to those who would make programming more expressive, and the worst to those who would try to streamline away subtlety. Performance is quite loosely linked to language, given sufficient abstractions and optimizations. I submit NumPy as an example. We humans have lots of ways to say what we want, and we want lots of different things in myriad ways. As an analyst I often wish for a richer language, some way I could transcend tabular data thinking to find and make associations around real-world state. I’m certainly self-satisfied when my nested subqueries return what I’m expecting, but I may be able to add more value if I had a better way of expressing my questions. If we can do better than SQL, it ought to bring more people closer to the reality that lies behind the data, and further from the methods used to obtain it. Maybe I don’t have the words for what I’m looking for yet...
- lsh 7y ago> I don’t know a single-word corollary to ‘Simpatico’ in English. "amiable"? "congenial"? "affable"?
- Pxtl 7y agoI love he relational model, but any language where null = null does not return true is insane. Yes, I understand the theoretical rationale behind three-value-logic. Over here where I'm getting actual work done, it's nothing but an obstacle.
- Pxtl 7y agoSeriously, were talking about a relational system where expressing a tree is super difficult. Why do we put up with this???
- rvalue 7y agoAny performance metrics for edgedb ?
- altmind 7y agoto do better than sql we should do at least as good as sql
- kthejoker2 7y agoJust wanted to say I see a lot of value in wrangling with the problems inherent to SQL, so kudos to you. Hopefully a transpiler API is in the works for all of those wonderful standards deviant implementations?
- ilitirit 7y agoI don't disagree with the obviously true statement, but this code comment comes to mind: // Dear maintainer: // // Once you are done trying to 'optimize' this routine, // and have realized what a terrible mistake that was, // please increment the following counter as a warning // to the next guy: // // total_hours_wasted_here = 42
- stingraycharles 7y agoAlso, don't forget the hours wasted of the people having to learn another query language. :)
- ErwinSmout 7y agoYou can test that for yourself. Go through the three language-related sections on my site and decide for yourself how many hours you'd need to "waste" before you would "get it". And as for "waste" : if while learning a better language, they are in addition also learning the relational model, and to think relationally, (their knowledge of both of which will be VERY poor if all they've ever seen is SQL) then there can't have been much time "wasted", can it ?
- djsumdog 7y agoOr the XKCD with the 14 competing standards and, "let's make one good standard," and now you have 15 competing standards.
- namelosw 7y agoI always have negative opinion on SQL but I can bear with it by just using a subset. Most of complex stuff are handled in application rather than SQL. Just use it as a simple data store. I think Datalog is a better alternative. However, for SQL or DBMS is a field with more powerful lock-in than other fields. Or Oracle wouldn't live so long so well without significant improvement over these years.
- xpil 7y agoI said this before and I will say it again: SQL is for data processing what IP is for networks: it's the neck of the hourglass. There are many things happening below SQL layer (storage engines, implementations, hardware etc) as well as above it (applications, reporting engines, various services and whatnot). There are many things happening below IP layer (hardware, protocols) as well as above it (TCP, applications). Even though there are better ways to build a neck of an hourglass, my bet is that (1) they are not much better and (2) it would be extremely difficult to get them replaced in all the existing hourglasses without breaking things terribly. Conclusion: SQL is going to stay forever, like it or not.
- mikl 7y agoThe end of that headline is "but it's not really worth the effort and will likely not succeed". Sure, SQL is not the most elegant language. But it works. It does what we need it to. Millions of developers knows it, countless tools speak it. So I expect EdgeQL to go over like a lead balloon. Unless you can convince one of the big existing SQL servers to adopt it, almost no one will ever get the chance to use it, and it'll be a niche language for a niche database.
- stepbeek 7y agoEdgeQL looks really interesting - I'm glad I read through the article. I think the issue - for me - with articles like this is the tendency to take the stance of "${EXISTING_TECH} sucks, let's drop it for this new thing" I would have found this way more compelling if this line was the very first in the article: > The relational model is still the most generally applicable and effective method of representing data.
- oxfordmale 7y ago>> We Can Do Better Than SQL (edgedb.com) No you can't. Many companies have tried, including very large and successful companies and have failed miserably. Just try out the JSON query language used by MongoDB, including their aggregation pipelines, and you will absolutely love SQL.
- co_dh 7y agokdb is better than sql.
- consultSKI 7y ago>> The NoSQL movement was born, in part, out of the frustration with the perceived stagnation and inadequacy of SQL databases. Maybe. I would suggest tight budgets and lack of talented DBAs are the two primary reasons NoSQL became a thing. "We can make do without a SQL DBA." No. You can't. IMNSHO
- daveheq 7y agoThe correct title for this article is "SQL can do better"
- _bxg1 7y agoVery exciting project. Not a very good name, as it conflates with the existing term, "Edge Computing", making one wonder if they're somehow related.
- fulldecent2 7y agoThe demise of SQL has been greatly exaggerated. If somebody wants to actually propose something better, the threshold is high. They should publish: - A tool which transpiles their new language into (multiple versions of) SQLite, MySQL, PostgreSQL - This tool should always produce a correct result (Modernizr) or a specific error (e.g. upgrade MySQL to XX+ to use `NEW_LANGUAGE_CODE_SNIPPET` JSON functions) - A separate tool that up-piles SQLite, MySQL, PostgreSQL to the new language, possibly exploiting new streamlined expressions - An editor with IntelliSense for the new language Even then you can probably achieve a lot value just by inputting table joins before the developer starts editing code. --- If you're not doing that then you are just keyword spamming by mentioning SQL.
- galaxyLogic 7y agohttps://www3.cs.stonybrook.edu/~warren/xsbbook/node11.html https://www3.cs.stonybrook.edu/~warren/xsbbook/node11.html