We all want to leave behind something that will outlast us, and Ruby processes are no exception. Every program you write leaves some record of its activity, even if it’s just data written to standard output. Most larger programs take this one step further: they store data from one run in a structured file, so that on another run they can pick up where they left off. There are a number of ways to persist data, from simple to insanely complex.
Simple persistence mechanisms like YAML let you write Ruby data structures to disk and load them back later. This is great for simple programs that don’t handle much data. Your program can store its entire state in a disk file, and load the file on its next invocation to pick up where it left off. If you never keep more data than can fit into memory, the simplest way to make it permanent is to store it with YAML, Marshal, or Madeleine, and reload it later (see Recipes 14.1, 14.2, and 14.3). Madeleine also lets you revisit the prior states of your data.
If your dataset won’t fit in memory, you need a database: a way of storing data on disk (usually in an indexed binary format) and retrieving parts of it quickly. The Berkeley database is the simplest database we cover; it operates like a hash, albeit a hash potentially much bigger than any you could keep in memory (Recipe 14.6).
But when most people think of a “database” they think of a relational database—MySQL, Postgres, Oracle, SQLite, or the like. A ...