[HN Gopher] Why SQLite succeeded as a database (2016)
       ___________________________________________________________________
        
       Why SQLite succeeded as a database (2016)
        
       Author : Tomte
       Score  : 295 points
       Date   : 2020-02-19 16:36 UTC (6 hours ago)
        
 (HTM) web link (changelog.com)
 (TXT) w3m dump (changelog.com)
        
       | joshdance wrote:
       | We used SQLite at my company to allow users to write SQL queries
       | against their db. When we hit the limit of it, we had to switch
       | to Postgres. That migration is quite difficult and I wish we had
       | used Postgres from the start. 20/20 hindsight but that was my
       | first thought.
        
         | kmfrk wrote:
         | Do you have any good articles or posts you can think of for
         | managing the migration, in case there're some lifesavers out
         | there.
        
           | rocmcd wrote:
           | Not an article, but I've used pgloader for this purpose in
           | the past:
           | 
           | https://pgloader.readthedocs.io/en/latest/
           | 
           | Great tool, I can't recommend it enough.
        
         | jessermeyer wrote:
         | Did you use WAL?
        
         | throwaway55554 wrote:
         | Were you using an ORM? I ask because most people use database
         | switching as a selling point for using an ORM. I'm rather
         | indifferent on the matter, but I'm curious.
        
           | kirstenbirgit wrote:
           | You still have to migrate the data. I faced the same kind of
           | dilemma, but with MySQL, and kind of noped out when I got to
           | stuff like [0].
           | 
           | [0] https://stackoverflow.com/a/87531/1210797
        
           | jtdev wrote:
           | Ha! This selling point is just one in a miserable litany of
           | poor reasons to use an ORM - you absolutely cannot simply
           | switch between databases without doing some work to ensure
           | that the data is migrated correctly and the SQL statements
           | translate properly.
        
             | nomel wrote:
             | Yeah, but verification of correctness is much less work
             | than implementation.
        
           | jimbokun wrote:
           | As an alternative to an ORM, there is another great
           | abstraction layer that works across a large number of
           | databases. It's called SQL!
        
             | kingbirdy wrote:
             | That's true in theory, but unfortunately you can still run
             | in to issues when different databases support different
             | parts of SQL, and the db you're migrating from has
             | different features than the one you're migrating to.
        
       | cjfd wrote:
       | Sure, it is simple and that is why people use it.
       | 
       | But I have also run into hard problems using it. Deleting and
       | renaming columns is not supported natively. On the internet one
       | can find procedures to do that but they generally do not take
       | foreign key references into account. Getting this right is a hard
       | problem. In the end we had a function that could be used to
       | rename or delete a column even without switching off foreign key
       | checking but it was not simple and it was not the first iteration
       | of said function and earlier iterations caused lots of subtle
       | problems, like a column having a default value or not depending
       | on whether the database was a new database or was created using
       | schema updates.
       | 
       | Use at your own peril.
        
         | acdanger wrote:
         | I've never had an issue altering or deleting columns in SQLite.
         | Grant it, I've used both Sequelize and SQLAlchemy as ORMs.
         | 
         | But if you're using SQLite for simplicity there's a good chance
         | you're not interested writing raw SQL statements either.
        
           | The_Colonel wrote:
           | Yeah, I'm using SQLite for simplicity and exactly because of
           | that I want raw SQL instead of some leaky complex ORM
           | abstractions.
        
             | yread wrote:
             | I use EF core and instrument all my queries - if I see a
             | slow one I hand optimize it. Best of both worlds I think -
             | and I say that as someone who loves to fiddle with SQL.
        
               | The_Colonel wrote:
               | Also worst of both worlds - you need to know very well
               | both the underlying database (SQL) and also the complex
               | leaky abstraction (EF Core) and how are those abstraction
               | translated into the SQL.
               | 
               | I'm no ORM hater (use Hibernate daily) but claiming that
               | using ORM will simplify working with the database is at
               | least misleading.
        
           | oefrha wrote:
           | Pretty sure SQLA the ORM has nothing to do with schema
           | migration, which is usually handled with alembic, the sister
           | project. Not sure about Sequelize.
           | 
           | Now, there's nothing magical about alembic's handling of
           | renaming or deleting columns for SQLite; it has to recreate
           | the table just like what you would do if you're hand rolling
           | the SQL, so it has the same problems.
           | 
           | Details: https://alembic.sqlalchemy.org/en/latest/batch.html
        
         | danso wrote:
         | Not disagreeing with your overall point about SQLite's feature
         | set, but IIRC, `ALTER TABLE RENAME` was added in 2018, for
         | version 3.25.0: https://www.sqlite.org/releaselog/3_25_0.html
         | 
         | (I chime in only to remark that I myself am constantly
         | surprised that SQLite continues to add these kinds of features
         | - e.g. WINDOW functions were also in 3.25 - long after I had
         | accepted their absence as a fact of life)
        
           | dana321 wrote:
           | Yeah, its a pity it doesn't have the ability to do anything
           | more than alter table statements that add to a schema, having
           | to rename the table, create a new schema and copy its
           | contents from the old table can be quite a tricky and
           | troublesome thing to do if you've got a live system running
           | with users on it.
        
           | cjfd wrote:
           | Ah, that is interesting. My experiences were before 2018 and
           | I had not kept an eye on it, so I did not know this.
        
             | cjfd wrote:
             | Ow, but looking at the docs they still do not seem to
             | support delete yet.
        
       | jbob2000 wrote:
       | TL;DR because it's simple.
        
         | thrower123 wrote:
         | I do wonder how much of the time that SQLite is used, that it
         | wouldn't be even simpler to just dump things to an XML file.
        
           | lurker458 wrote:
           | Here are some considerations why: https://danluu.com/file-
           | consistency/
        
         | umvi wrote:
         | Is it simple, though? I mean, reading about how they test it[1]
         | leads me to believe it is not simple. Maybe it's simple
         | compared to Oracle, and maybe _using it_ is simple, but the
         | actual implementation is definitely _not_ simple.
         | 
         | [1] https://www.sqlite.org/testing.html
        
           | jbob2000 wrote:
           | I don't care about the implementation and I congratulate the
           | developers on abstracting all of that complexity away from
           | me. That's what good software does.
        
             | umvi wrote:
             | I misinterpreted your comment. I thought you were saying
             | SQLite was successful because SQlite itself (i.e. the
             | implementation) was simple, not because it was simple to
             | use.
        
               | wpietri wrote:
               | For what it's worth, I use "simple" for talking about the
               | complexity of the thing, and "easy" for the user
               | experience. Quite frequently easy things have to be
               | complex because the cognitive load gets shifted into the
               | machinery.
               | 
               | E.g., compared with a Model T, modern cars are much
               | easier but much more complex because the car itself
               | understands things like adjusting the ignition timing and
               | safely getting the motor turning, things that a Model T
               | user had to understand if they wanted to avoid getting a
               | broken arm before they got out of the driveway:
               | https://www.fordmodelt.net/how-to-drive-ford-model-t.htm
        
           | solarkraft wrote:
           | It's simple to use.
        
             | umvi wrote:
             | Most of the time, yes, if SQLite supports the filesystem
             | you are using. If the filesystem doesn't have a particular
             | feature SQLite needs, it can be difficult to get working
             | the way you want it to.
        
               | danso wrote:
               | What scenarios/filesystems lead to these kinds of
               | conflicts?
        
               | franga2000 wrote:
               | Not exactly a filesystem, but it doesn't work on SMB
               | shares, which is an enormous pain in the ass. And I'm not
               | even talking about concurrent access - just one user. I
               | get that SMB file locking is a mess, but making it a hard
               | fail by default was a big mistake IMO as most develoers
               | using the library don't make special cases to allow this.
        
               | nomel wrote:
               | The documentation is very clear than SQLite over a
               | network isn't a good use case, for reasonably sized data.
               | Item 1 from "Checklist for choosing the right database
               | engine" [1]
               | 
               | > 1. Is the data separated from the application by a
               | network? - choose client/server
               | 
               | > Relational database engines act as bandwidth-reducing
               | data filters. So it is best to keep the database engine
               | and the data on the same physical device so that the
               | high-bandwidth engine-to-disk link does not have to
               | traverse the network, only the lower-bandwidth
               | application-to-engine link.
               | 
               | > But SQLite is built into the application. So if the
               | data is on a separate device from the application, it is
               | required that the higher bandwidth engine-to-disk link be
               | across the network. This works, but it is suboptimal.
               | Hence, it is usually better to select a client/server
               | database engine when the data is on a separate device
               | from the application.
               | 
               | 1. https://www.sqlite.org/whentouse.html
        
               | umvi wrote:
               | Well the issue I ran into was that I wanted a SQLite db
               | to have one writer and many readers. However, what I was
               | seeing was that queries were failing because the DB was
               | locked at the time of reading. The solution is to switch
               | journaling mode to WAL[1].
               | 
               | However the particular platform I was developing for was
               | an embedded system using the JFFS2 filesystem. JFFS2
               | doesn't support shared mmap, which is a feature SQLite
               | needs for WAL.
               | 
               | So basically, it was big pain - I had to setup a tmpfs
               | mount point where the WAL-enabled DB resided and then
               | periodically sync it to flash.
               | 
               | [1] https://www.sqlite.org/wal.html
        
               | BubRoss wrote:
               | Why didn't you just do more granular writes and let the
               | different processes lock the file? SQLite is impressively
               | fast, it can handle a lot before you need a full
               | database.
        
               | umvi wrote:
               | I don't know how to do that.
               | 
               | Basically there is one process periodically dumping stats
               | into a sqlitedb. There is an HTTP API that can retrieve
               | said stats. How do I make it so the HTTP API doesn't
               | occasionally fail when trying to read from the DB?
        
         | gwd wrote:
         | I'd say there are a load of reasons, all of which combine
         | together to make it unbeatable:
         | 
         | * Simple to embed into you application (no setting up a
         | separate database, &c).
         | 
         | * Fantastically backwards compatible
         | 
         | * Public domain (so easy to comply with the license)
         | 
         | * High quality: Reasonably fast, reasonably efficient,
         | reasonable feature support.
         | 
         | The lack of any of these would add significant drag. It's
         | difficult to imagine any other project catching up and
         | displacing it at this point.
        
           | bob1029 wrote:
           | I personally cannot see any near term replacement for what
           | SQLite offers. In my world, SQLite became the way in which I
           | now manipulate a scope of structured data on a single logical
           | disk. I mostly view it as a very reliable and friendly layer
           | on top of basic file IO which also happens to be compatible
           | with virtually every computer on earth. I can copy a SQLite
           | database out of an embedded microcontroller environment and
           | directly open it on my x86_64 workstation, edit some values,
           | and then copy it back down without any fears of compatibility
           | issues.
        
       | rhombocombus wrote:
       | I came to SQLite recently having used big iron enterprise tools
       | for my analytical work previously (namely Oracle), and wow, what
       | a lovely elegant tool. It isn't just super useful for web and
       | embedded applications, it is quite a powerful and convenient
       | analytical tool for quickly ingesting huge flat files and
       | querying them.
        
       | AdmiralAsshat wrote:
       | The interview transcript is much appreciated! I hate it when
       | random two-hour podcast has a 15 minute interview I want to
       | listen to, and have to go hunting for it.
        
         | rtkwe wrote:
         | Which is a shame because most podcast apps have chaptering
         | systems where particular interviews and segments can be easily
         | bookmarked. Even without that feature show notes can include
         | links and timestamps to particular segments too but many shows
         | don't bother because it's extra work.
        
       | vbezhenar wrote:
       | While everyone's praising SQLite, I want to note that SQLite type
       | system is absolutely horrible. When you can store string in the
       | integer column, you don't have a type system. And it's absolutely
       | not intuitive for people having experience with other databases.
        
         | senderista wrote:
         | I agree, if you want dynamically typed columns then just define
         | a separate Any or Variant type. I don't see the point of schema
         | if it's not enforced.
        
           | v64 wrote:
           | Hipp talks about that in the interview a little bit:
           | 
           | > SQLite really started life as a Tcl extension, Tcl being
           | the programming language, the Tcl/Tk. The project I was
           | working was working on was written in Tcl/Tk and so SQLite
           | began as a Tcl extension and as a scripting language, like
           | Perl or Python, where you can put any type of value you want
           | in a variable. So a variable might hold a string, a number, a
           | byte array or whatever. So I made SQLite the same way, where
           | just because you've declared a column of a table to be text
           | doesn't mean you can't put integer in there, or just because
           | you declared a column in the table to be a short int, why not
           | put a 2-megabyte blob there? So what? It'll do that.
           | 
           | > Or if you have a comment that's declared integer and you
           | try to put text in it, it looks like an integer and it can be
           | converted without loss. It will convert and store it as an
           | integer. But if you try and put a blob into a short int or
           | something, there's no way to convert that, so it just stores
           | the original and it gives flexibility there. And this is
           | useful in a lot of cases, because sometimes you just have a
           | miscellaneous column in a table that you might need to store
           | lots of different things in. And in traditional database
           | systems you actually have to have multiple columns, one for
           | each possible data type, whereas in SQLite you put it all in
           | one column. So it works well.
           | 
           | > And for that matter, with SQLite you don't have to give the
           | column a type at all. You can just say, CreateTable T1
           | (a,b,c) and then you've got a table with three columns named
           | a, b and c and you put whatever you want there.
           | 
           | > Well, it flows directly out of the scripting language
           | traditions. You don't declare types for variables in Tcl; you
           | didn't used to do it in Python, I guess you can do it some,
           | now. You don't do it in JavaScript... You just say it's a
           | var.
        
         | zachwill wrote:
         | I actually prefer SQLite's take on type affinity:
         | https://www.sqlite.org/datatype3.html
        
       | bob1029 wrote:
       | SQLite is a wonderful database. We use it in production many
       | times over for all of our clients. Not having to worry about
       | whatever arbitrary SQL Server installation is available in a
       | particular environment has saved us so much time and frustration.
       | Combine SQLite with .NET Self-Contained Deployments means that we
       | (our automated tools) now copy our software distribution zip to
       | target, extract to path, run executable as administrator and walk
       | away. Without SQLite we could not do this.
       | 
       | Migrations are also hilariously easy with SQLite if you use the
       | user_version pragma. We have a monotonically-incrementing number
       | to indicate each version. Our migrator first queries this upon
       | startup and runs all the migrations that exist between current
       | user_version and whatever our highest sequence # is (defined as a
       | constant in code). Some might argue that you should just use EF
       | (or whatever language-specific ORM), but I prefer the level of
       | control and the substantial performance boost you get with raw
       | SQL and a simple migrator approach. I cannot speak for EF Core,
       | but EF6 performance was absolutely abysmal in some more complex
       | cases.
       | 
       | I would also say that performance might surprise you if you turn
       | on WAL. I have saturated NVMe disks inserting lots of data into
       | SQLite. The trick is to use a single connection and let SQLite
       | handle the serialization for you, rather than try to manage
       | multiple connections to the same file in code (i.e. one
       | connection per logical operation sucks for SQLite).
        
         | api wrote:
         | I came here to say this. It succeeded because it's an
         | extraordinarily high quality piece of code!
         | 
         | The 'lite' is even a bit of a misnomer. Properly tuned I've
         | seen 1TB+ SQLite databases work just fine. It doesn't scale
         | horizontally with CPU cores as well as a "real" database but it
         | can perform very well with large data sets if there's only one
         | or two writers.
        
           | StreamBright wrote:
           | What is the underlying storage structure that scales to TB+?
        
             | pjscott wrote:
             | Just regular B-trees for row and index storage. There's a
             | reason why it's such a popular data structure!
             | 
             | https://www.sqlite.org/arch.html
        
             | bob1029 wrote:
             | If you want TB+, you are talking about multiple computers
             | (in context of indefinite scaling).
             | 
             | For most who browse HN that immediately means you reach for
             | Postgres (and you would be wise to do so), but I would
             | argue you can continue to use SQLite indefinitely (one
             | instance per node) if you manage replication and
             | transactions between nodes at your application layer.
             | 
             | I realize this is probably beyond what most developers want
             | to screw with, but I have seen some extremely promising
             | results in experimental implementations of this scheme.
             | Being able to replicate items conditionally based directly
             | on business needs is a very powerful capability on paper -
             | E.g. User session data must be synchronously replicated to
             | all nodes, while other entities can by asynchronously
             | replicated based on their use cases. You could handle
             | replication and transactions based upon any business factor
             | or state if you go down this path.
        
               | chaz6 wrote:
               | There is a derivative called rqlite which uses the raft
               | consensus protocol to give you a highly fault-tolerant
               | distributed database.
               | 
               | https://github.com/rqlite/rqlite
        
               | senderista wrote:
               | It's a great idea and I'm working on something similar,
               | but Raft or any other quorum-based consensus protocol is
               | a poor choice for the data plane.
        
           | nbevans wrote:
           | There is actually no "lite" word in SQLite. Think of it as
           | SQL-ite. The "ite" is a deliberate connotation to
           | rocks/geology i.e. granite, magnetite, etc. Make of that what
           | you will. This is documented BTW on the SQLite docs.
        
             | spondyl wrote:
             | While I couldn't find anything in the docs, there's a
             | snippet of a transcript here:
             | https://changelog.com/podcast/201#transcript-67
        
               | kohtatsu wrote:
               | Another: http://sqlite.1065341.n5.nabble.com/SQLite-
               | Pronunciation-td8...
               | 
               | >[...] I think it should be pronounced "S-Q-L-ite". Like
               | a mineral. But I'm cool with y'all pronouncing it any way
               | you want. :-)
        
         | inferiorhuman wrote:
         | _one connection per logical operation sucks for SQLite_
         | 
         | How is this typically handled? Using OS file locking
         | primitives?
        
           | zahrc wrote:
           | Yes
           | 
           | https://www.sqlite.org/faq.html#q5
        
         | jessermeyer wrote:
         | I know SQLite's SQL query engine is implemented as a VM. Are
         | there ways of optimizing repeated queries, similar to compiling
         | a query to avoid the VM churn? Perhaps more importantly, have
         | you ever been disappointed by the query engine's performance?
        
           | nbevans wrote:
           | You can "prepare" a SQL statement and use it multiple times.
           | I.e. you can use the same VM for a statement many times.
        
         | to11mtm wrote:
         | >Some might argue that you should just use EF (or whatever
         | language-specific ORM), but I prefer the level of control and
         | the substantial performance boost you get with raw SQL and a
         | simple migrator approach. I cannot speak for EF Core, but EF6
         | performance was absolutely abysmal in some more complex cases.
         | 
         | Look into Linq2Db [1] (Disclaimer, I contribute to the project
         | a little bit.)
         | 
         | It's the perfect in-between for if you want LINQ like
         | abstractions but don't want the overhead of an ORM, it's more
         | like Dapper than, say, EF or NHibernate.
         | 
         | Best of both worlds: I can quickly prototype a design using
         | SQLite, and then flip it over to SQL Server/Postgres by
         | changing a config string.
         | 
         | EF Core is somewhat improved from EF in some ways (It's faster,
         | often as fast as Linq2Db or Raw SQL) but has moved backwards in
         | others (lots of stuff still doesn't work right, more
         | importantly things that -used- to work in EF6). IMO EF Core
         | tries to do too much; It tries to give the same API to
         | interface with both Relational and KV stores, and results in
         | not being great at either.
         | 
         | [1] https://github.com/linq2db/linq2db/
        
           | bob1029 wrote:
           | We exclusively use Dapper for all database access. I have
           | zero problems with a few string constants in my services that
           | contain the requisite SQL statements for managing my business
           | entities against the database. It's really nice having such a
           | consolidated context where your SQLite implementations are
           | just single partial classes tacked onto the services you are
           | providing persistence for.
           | 
           | That is one other point - SQLite has enabled us to do some
           | really deep consolidation of our codebase. We generally use
           | one SQLite database per business entity or abstraction.
           | Users.db, Logs.db, Sessions.db, Settings.db, etc. It allows
           | for a truly 100% independent vertical stack (aside from
           | coupling against business models) for purposes of developing
           | various pieces of business functionality. This is, in my
           | view, is the perfect ideal of 'microservice' architecture.
           | One big folder called services, one class per 'microservice',
           | one SQLite database per class, one collection of mappers per
           | class, etc. I honestly feel like we have settled on the
           | perfect grain for our codebase structure (at least in C#/.NET
           | Core land). The benefit in our world is that instead of HTTP-
           | based RPC, we are doing direct method invocation throughout.
           | We also use Blazor in order to extend this concept as close
           | to the screen as technically feasible.
        
         | miohtama wrote:
         | My only grievance, and a blocker, is that SQLite does not
         | support decimal numbers, making it less practical to work with
         | finance related data.
        
           | webpaymentsguy wrote:
           | You probably already heard of storing amount in cents as an
           | integer, but it's a pattern worth mentioning if it fits your
           | use case.
        
             | marton78 wrote:
             | I don't know how it's done in the US, but in Europe
             | financial calculations are done with four digits after the
             | dot.
        
         | GordonS wrote:
         | I've been using SQLite for something like 20 years - how did I
         | not know about `user_version` until now?!
         | 
         | I've always added a `schema_version` table with a single row
         | containing a single column with the version, so thanks for
         | letting me know about this!
        
       | everybodyknows wrote:
       | >... they realized that if this is a critical part of their
       | infrastructure, they needed to make sure my business was
       | sustainable.
       | 
       | >So companies which are typically large companies that really
       | depend on SQLite as part of their product, they just pay us an
       | annual fee.
       | 
       | >... we are a 100% engineering shop.
       | 
       | An intriguing option for anyone sitting on an original
       | infrastructure solution, and looking to turn it into a
       | livelihood, with quality of life as first priority.
        
       | danso wrote:
       | I remember listening to this when it was recorded and I still
       | remember details from it years later - probably my favorite
       | Changelog podcast ever. It's obviously very foolish to make
       | software choices based on how much you like its creator as a
       | person. But Richard Hipp comes off as a guy so likable that
       | goshdarnit, I hope his little project succeeds. Jokes aside,
       | though, I don't think it's entirely coincidence that SQLite,
       | something that is so good and reliable, was made by someone who
       | seems so conscientious and thoughtful.
       | 
       | Though I have to admit, I was and am still disappointed to learn
       | that the official way to pronounce SQLite is "S-Q-L-ite", i.e.
       | "like a mineral".
        
         | eropple wrote:
         | Conscientiousness and empathy are rare commodities in software
         | development. It's difficult for somebody to get out of their
         | own head and consider a problem fresh, and it's not always
         | personally rewarding to do so. It's also expensive, if you want
         | to back it up with user testing.
         | 
         | You see it, even, in ostensibly public-consumption open-source
         | projects, where the goal is clearly not merely to scratch one's
         | own itch but to market the project for uptake for this reason
         | or that. I feel like SQLite is a great example of what happens
         | when a team is able to foster the kind of empathy to really
         | understand how the user _wants it to be_.
        
         | barkingcat wrote:
         | I pronounce it "ess que lite"
        
         | hazebooth wrote:
         | I'll be honest and say that in my head, I think 's-q-l lite'
        
         | [deleted]
        
         | scohesc wrote:
         | I thought it was always pronounced "sequel-ite" personally
        
           | sweeneyrod wrote:
           | No love for "seekwelitay"?
        
             | 333c wrote:
             | This is how I will pronounce SQLite from now on.
        
             | phnofive wrote:
             | Eskewellite
             | 
             | Sequelliteh
             | 
             | Squalitee
             | 
             | Cirquerlanite
             | 
             | Diet Seek-well
        
           | larrydag wrote:
           | MySQL is the same way. A lot of people say My-sequel but I
           | think its supposed to be my-ess-que-ell
        
             | zitterbewegung wrote:
             | We need a normal form for pronouncing and naming relational
             | databases.
             | 
             | I'm half joking but it might alleviate people from being
             | confused.
        
               | wongarsu wrote:
               | I thought the norm was to pronounce SQL as "sequel" in
               | Microsoft products and "ES-QUEUE-EL" in every other
               | context
        
               | WorldMaker wrote:
               | The norm is to pronounce it by how likely you think you
               | might get yelled at for trademark infringement by a
               | holding company of the assets of an old aircraft company:
               | https://en.wikipedia.org/wiki/Hawker_Siddeley
               | 
               | The name confusion is all IBM's fault.
               | 
               | > Chamberlin and Boyce's first attempt of a relational
               | database language was Square, but it was difficult to use
               | due to subscript notation. After moving to the San Jose
               | Research Laboratory in 1973, they began work on SEQUEL.
               | The acronym SEQUEL was later changed to SQL because
               | "SEQUEL" was a trademark of the UK-based Hawker Siddeley
               | Dynamics Engineering Limited company.
        
               | zentiggr wrote:
               | So that trademark has been un-revivable since 2005...
               | long past time to start saying "sequel" for real :)
        
               | DennisP wrote:
               | I preferred to call it "Squeal Server."
        
             | somurzakov wrote:
             | my-ass-que-ell is the way to go
        
             | ivalm wrote:
             | I looked it up, you're right, it is officially my-ess-que-
             | ell. This leads to another question, how do you pronounce
             | "NoSQL"? I couldn't find a convincing answer on the web. I
             | used to say "sequel" for everything SQL related but clearly
             | I was wrong.
        
               | MR4D wrote:
               | "red iss"
        
             | WorldMaker wrote:
             | PostgreSQL is the fun one out because they officially say
             | it is Postgres-Q-L.
             | 
             | The "it's always S-Q-L and never `sequel`" is IBM's fault
             | and an early trademark infringement issue in computing.
             | (IBM was told it couldn't call it "SEQUEL" by an aircraft
             | company.)
        
               | degenerate wrote:
               | For anyone curious about the trademark infringement, I
               | hunted down the excerpt from the book that Wikipedia uses
               | as a source (a book called _Databases Demystified_ ) and
               | this is what it says in the book:
               | 
               | >> _The forerunner of SQL, which was called SEQUEL (for
               | Structured English Query Language), first emerged in the
               | specifications for System R, IBM's experimental
               | relational database, in the late 1970s. However, two
               | other products, with various names for their query
               | language, beat IBM to the marketplace with the first
               | commercial relational database products: Relational
               | Software's Oracle and Relational Technology's Ingres. IBM
               | released SQL /DS in 1982, with the query language name
               | shortened to "SQL" after IBM discovered that "SEQUEL" was
               | a trademark of the Hawker-Siddeley Aircraft Company. When
               | IBM released its next generation RDBMS, called DB2, the
               | SQL acronym remained. To this day, you will hear the name
               | pronounced as an acronym (S-Q-L) and as a word (see-
               | quel), and both are considered correct pronunciations._
               | 
               | I was hoping for a bit more interesting or detailed
               | story.
        
               | big_chungus wrote:
               | I typically go with just "postgres" for phonetic
               | pronunciation. Not sure how else it would be done;
               | "postgres sequel?"
        
               | bhandziuk wrote:
               | Postgres queue ell
        
               | airstrike wrote:
               | I go with psql personally
        
               | why-el wrote:
               | genuinely not sure if you are joking or not, but that's
               | not the same thing as postgres! :)
        
               | jdfellow wrote:
               | I've heard Postgres pronounced as if it were French.
               | "Postgree."
        
               | andrewflnr wrote:
               | I've heard that, but assumed it came from splitting up
               | the name as "Postgre"+"SQL"; if you leave off the SQL
               | part you get a word ending in E, and "postgreh" can't be
               | right, can it? :)
        
               | WorldMaker wrote:
               | Which is why I've also heard developers that either
               | assumed the 'g' was silent or a transposition problem and
               | you get "poster SQL", "postreg SQL", or worst of all
               | "posgret SQL".
               | 
               | Somewhere, I believe in an HN comment, I saw a Postgres
               | developer say that one of the biggest regrets of the
               | project naming was capitalizing that "shared S".
        
               | ferzul wrote:
               | i'm weirded out by the fact that i always use the
               | "official" pronunciations for all these products
        
           | gavinray wrote:
           | Last month I discover NGINX is not pronounced "en-jinx", and
           | today I discover SQLite is not pronounced "sequel-light".
           | 
           | 2020 is turning out to be pretty terrible guys.
        
             | barneygale wrote:
             | Wait until you hear how 'valgrind' rhymes with 'grinned'!
        
             | lioeters wrote:
             | You and me both, my friend.
             | 
             | Apparently I've been using S-Q-L-ite, not S-Q-Lite.
             | 
             | All these years I've been using "Engine-X", not "en-jinx",
             | and didn't know it..
             | https://www.nginx.com/resources/wiki/community/faq/
        
               | Volundr wrote:
               | I only knew it because I had to look up the
               | pronunciation. I kept calling it N-G-I-N-X, but could
               | never remember the spelling.
        
           | buckminster wrote:
           | Sequel-lite here. I know that makes no sense phonetically.
        
           | agumonkey wrote:
           | and it does sound like a mineral which is quite in line with
           | how I see sqlite.. pretty, timeless and rock solid
        
           | big_chungus wrote:
           | I think there's a case for disputing the official
           | pronunciation because it's based off an "official"
           | pronunciation of SQL. I've heard it ess-queue-elle and
           | sequel, but personally side with sequel. It was originally
           | called "Structured English Query Language", abbreviated and
           | pronounced "SEQUEL"; later shortened to "SQL" but same
           | pronunciation. So I figure sequel-ite is a perfectly
           | legitimate pronunciation.
        
           | danso wrote:
           | That's how I do it. I understand the etymological reasons for
           | "S-Q-L-ite", but SQLite is just too ubiquitous in my everyday
           | work for me to speak 4 syllables when referring to it.
        
           | cheez wrote:
           | And I thought it was S-Q-lite. S-Q-L-ite makes sense though.
           | Most consistent.
        
             | airstrike wrote:
             | I say S-Q-Lite except I pronounce the S and Q in Portuguese
             | and the rest in English...
             | 
             | Luckily I code on my own, so nobody hears this abomination
             | out loud
        
               | gdsimoes wrote:
               | I do the same thing. Maybe we should talk.
        
         | remmargorp64 wrote:
         | I'm still just gonna keep calling it "sequel light".
        
         | krn wrote:
         | > Jokes aside, though, I don't think it's entirely coincidence
         | that SQLite, something that is so good and reliable, was made
         | by someone who seems so conscientious and thoughtful.
         | 
         | The same could probably be said about Redis and Salvatore
         | Sanfilippo.
        
       | mrzacsmith wrote:
       | I found this fascinating, as a student we are taught to use
       | SQLite and then told to use PostgreSQL for production. I am told
       | that a large amount of mobile native apps use SQLite. Does anyone
       | have any stats on this? Seems like a nice choice, but the
       | searches I have done are all over the place.
        
       | me551ah wrote:
       | SQLite is a brilliant lightweight database which is available
       | everywhere. All mobile OSs support it and it's a breeze to run on
       | even embedded Linux. I just wish web browsers would also support
       | it and make webSQL a standard, it would make programming for the
       | web so much easier.
        
         | hasperdi wrote:
         | Actually, it was about to become standards. Some browsers
         | implemented it, but then they decided not to go ahead as all
         | browsers will have the same SQLite implementation.
        
           | atishay811 wrote:
           | It is weird in the hindsight as with just Webkit(which is
           | most of blink still) and Gecko, there are just two engines
           | left. And when Gecko goes down (which is losing market
           | share), this would seem even more stupid. SQL is a standard.
           | They could have standardized on it rather than an
           | implementation.
        
             | Carpetsmoker wrote:
             | SQL is a standard, but SQLite doesn't implement "standard
             | SQL", it implements "SQLite SQL".
             | 
             | For better or worse, the web has always been driven by
             | specifications, rather than implementations. Properly
             | standardizing all of SQLite in a spec is not trivial, and
             | as much I think SQLite is great software, I don't think
             | that relying on SQLite the library _specifically_ would be
             | a good idea. What if the latest version of SQLite does
             | something that 's not in the spec or prohibited by the
             | spec?
             | 
             | Either way, there's IndexedDB now, which is supported by
             | almost everything, including IE.
        
               | Krustopolis wrote:
               | Internet Explorer would like to have a word with you. It
               | was clearly an "implementation over specification"
               | effort.
        
               | nolok wrote:
               | > For better or worse, the web has always been driven by
               | specifications, rather than implementations.
               | 
               | Surely you're joking ? Having things done by
               | specifications first has been extremly rare, pretty much
               | everything rather followed the "make the specification
               | after the fact to be whatever X browser has done and is
               | used". Protocols, markup, css, javascript, the whole
               | thing was done by implementation.
        
               | firethief wrote:
               | > For better or worse, the web has always been driven by
               | specifications, rather than implementations.
               | 
               | What? The specifications document what browsers already
               | do. Have you seen the HTML5 spec? It's mostly
               | formalization of error-recovery, showing how to interpret
               | previously technically-broken documents in the way modern
               | browsers have converged on. It's not what anyone would
               | design, but there's no one driving.
        
         | 3fe9a03ccd14ca5 wrote:
         | Once I discovered SQLite, I never went back. It's so easy. I'm
         | still shocked when I see docker compose files that spin up
         | entire MySQL dbs when a simple SQLite connector would be so
         | much easier!
        
           | williamdclt wrote:
           | Whether it is in staging, in dev or in tests, use the same DB
           | engine as in prod. It _will_ save your butt sometimes.
           | 
           | Also, my docker-compose for a Postgres container is
           | literally:                   services:           db:
           | image: postgres:10             ports:               -
           | "5432:5432"
           | 
           | "so much easier" seems very hyperbolic. Not denying that
           | SQLite is an amazing piece of software though!
        
       | jokoon wrote:
       | Don't forget about SpatiaLite! Having a GIS-capable lightweight
       | database, without relying on a typical DB system is pretty nice
       | too.
        
       | Animats wrote:
       | Because they took reliability seriously.
       | 
       | If the people who did the original Macintosh "resource fork"
       | updater had been serious about maintaining consistency of the
       | data structure, that approach would have lasted longer. That was
       | a really good idea, badly implemented because they had to cram it
       | into 128KB and use a floppy. Unfortunately, it wasn't rewritten
       | when the Mac line got more memory and hard disks.
       | 
       | Somebody had to get the open source world past using text files
       | for everything.
        
       | outworlder wrote:
       | One thing that I wish more people realized, especially ones
       | developing native apps, is this: unless you really need an
       | specific file format for your application, don't design your own.
       | Just use SQLite. You get so much out of it (including features
       | like undo), as well as a huge toolkit.
        
         | combatentropy wrote:
         | "SQLite does not compete with client/server databases. SQLite
         | competes with fopen()." ---
         | https://www.sqlite.org/whentouse.html
        
         | jimis wrote:
         | > (including features like undo)
         | 
         | Can you please elaborate on this?
        
       | crmrc114 wrote:
       | Serious question, how in the heck did the podcasters get their
       | transcript? Did they pay someone to edit a machine translation?
       | That is one of the coolest things I have never seen for any
       | podcast!
        
         | cxr wrote:
         | Asked and answered here:
         | 
         | https://news.ycombinator.com/item?id=15251977
        
         | shadowgovt wrote:
         | I don't know how they seeded the transcript set (looks like
         | this one landed in 2017), but nowadays, transcripts are
         | accepted via GitHub.
         | 
         | https://github.com/thechangelog/transcripts
        
       | GnarfGnarf wrote:
       | My app had been running on CodeBase (dBase clone from Sequiter)
       | for twenty-five years. When we converted to macOS, CodeBase
       | wouldn't compile for 64-bit. Panicked, I turned to SQLite.
       | Miraculously, we were able to switch in a couple of weeks. It is
       | indeed a pleasure to work with. Especially with tools like DB
       | Browser to poke around with.
        
       | JTbane wrote:
       | It does one thing and does it well.
        
       | janvdberg wrote:
       | Meta: this podcast's RSS feed only goes back so far (2018). So I
       | have no way to add/listen to this episode in my podcast app?
        
         | jerodsanto wrote:
         | We used paged feeds[1] for our RSS, but not all podcast clients
         | support it. I might end up going back to a full feed, but
         | remove the show notes, etc from older episodes to keep the file
         | size smaller...
         | 
         | [1]: https://podlove.org/paged-feeds/
        
           | janvdberg wrote:
           | Ok that makes sense. But I use Overcast, so how can I listen
           | to it?
        
       | hharnisch wrote:
       | For all the great things about SQLite there are some concerning
       | things around the project.
       | 
       | First off, even though the source code is public domain, you
       | can't contribute since it is closed source:
       | https://sqlite.org/copyright.html
       | 
       | There are 3 developers who maintain the project
       | https://www.sqlite.org/crew.html and operate under a "code of
       | ethics" that used to be called their "code of conduct"
       | https://sqlite.org/codeofconduct.html
       | 
       | While it succeeded in getting widely adopted I have trouble
       | believing that this is sustainable.
        
         | dekhn wrote:
         | they have contracts to support the US military for many decades
         | into the future. Hard to be more sustainable than that.
        
           | hharnisch wrote:
           | There are 3 people on the planet who can make changes to it
           | and one person who can work on their custom made source
           | control system. Single points of failure are not sustainable.
        
             | Carpetsmoker wrote:
             | Well, it's been popular for 20 years, so that sounds fairly
             | sustainable to me. A lot of projects with many more
             | contributors have come and gone in that time period.
             | 
             | Either way, that doesn't make it "closed source" like you
             | said in the other comment.
        
             | tzs wrote:
             | > There are 3 people on the planet who can make changes to
             | it
             | 
             | Anyone on the planet can make changes to it and distribute
             | those changes. The only thing those 3 can do that the rest
             | of us cannot is get their changes into the copies
             | distributed at sqlite.org.
        
           | SQLite wrote:
           | Just to be clear: We do not have any support contracts with
           | the US military, nor any other US government agency, nor any
           | other government entity, either inside or outside the US. Not
           | that we would turn down such work if it were available, it is
           | just that is has never come up.
        
             | dekhn wrote:
             | I'm pretty sure I read this in an interview with one of the
             | authors. However, I can't find it, so I will defer to you.
             | Apologies for the implication.
        
         | otoburb wrote:
         | They address this directly under the section entitled "Open-
         | Source, not Open-Contribution":
         | 
         |  _SQLite is open-source, meaning that you can make as many
         | copies of it as you want and do whatever you want with those
         | copies, without limitation. But SQLite is not open-
         | contribution. In order to keep SQLite in the public domain and
         | ensure that the code does not become contaminated with
         | proprietary or licensed content, the project does not accept
         | patches from unknown persons._
         | 
         | In other words, the reasoning is that since the code is
         | released to the public domain, they want to ensure they can
         | continue doing so without encumbering or confusing future
         | releases with tainted contributions. Quite admirable.
        
         | thrower123 wrote:
         | It's unfortunate that they bowed to pressure and removed their
         | original monastic code of conduct.
        
         | oefrha wrote:
         | Being open source and being open to contributions are pretty
         | much orthogonal. SQLite itself is every bit open source.
         | 
         | This isn't even a particularly strange arrangement for open
         | source. See _The Cathedral and the Bazaar_.
        
         | jjeaff wrote:
         | Huh? The page you linked clearly says "Open Source".
         | 
         | So even if those 3 developers disappear tomorrow, you can fork
         | the source code and compile and maintain your own.
         | 
         | https://www.sqlite.org/src/doc/trunk/README.md
         | 
         | And it's already been sustained for 20 years meaning it has
         | outlasted the great majority of software projects out there.
        
         | greenshackle2 wrote:
         | It's pretty normal for open source projects to refuse
         | contributions from anyone who hasn't signed a CLA or something
         | similar. The alternative is a legal nightmare.
        
         | [deleted]
        
       ___________________________________________________________________
       (page generated 2020-02-19 23:00 UTC)