What's the best way to store the bible in SQL?

Here is another collection / example for you:

https://github.com/scrollmapper/bible_databases

Here you will see SQL, XML, CSV, and JSON. Of special note is the cross-reference table (quite extensive and amazing) and a simple verse-id system for fast queries.

EDIT: Notice the ids of the tables are book-chapter-verse combinations, always unique.


SQL is the BEST way to store this. Considering your requirement we can split them into two major parts

  1. Information that's dependent on individual version

    • Small caps
    • Red letter print
  2. Information that isn't dependent on individual version

    • Book, Chapter, Verse numbers
    • Section title
    • Foot notes (??????)
    • Cross Reference
    • Commentary

For various reasons I prefer to store the whole bible project into one SINGLE table, Yes call it as bible

For your visual here is my screen I have stored nearly 15 versions of bible in single table. Luckily the different version names are just kept as column wide. When you add more version in future your table grows horizontally which is okay thus the # of rows remain constant(31102). Also, I will request you to realize the convenience of keeping the combination of ('Book, Chapter, Verse') as the PRIMARY key because in most situations that's the look-up way.

enter image description here

That said here is my recommended table structure.

CREATE TABLE IF NOT EXISTS `bible` (
  `id` int(11) NOT NULL AUTO_INCREMENT, --Global unique number or verse
  `book` varchar(25) NOT NULL,  --Book, chapter, verse is the combined primary key
  `chapter` int(11) NOT NULL, 
  `verse` int(11) NOT NULL,
  `section_title` varchar(250)  NOT NULL, -- Section title, A section starts from this verse and spans across following verses until it finds a non-empty next section_title
  `foot_note` varchar(1000)  NOT NULL,  -- Store foot notes here
  `cross_reference` int(11) NOT NULL, -- Integer/Array of integers, Just store `id`s of related verses 
  `commentary` text  NOT NULL, -- Commentary, Keep adding more columns based on commentaries by difference authors
  `AMP` text  NOT NULL, -- Keep, keep, keep adding columns and good luck with future expansion
  `ASV` text  NOT NULL,
  `BENG` text  NOT NULL,
  `CEV` text  NOT NULL,
  PRIMARY KEY (`book`,`chapter`,`verse`),
  KEY `id` (`id`)
) 

Oh, What about the Small caps and Red letters?

Well, Small caps & Red letters you can store in version columns using HTML or appropriate formats. In the interface you can strip them off based on user's choice whether he requires red letter or small caps.

For reference, you can download the SQLs from below and customize in your way

Bibles in SQL format


Rather than reinventing the wheel, you might consider using a "Bible SDK" such as AV Bible, which stores text, formatting, verse numbers, etc. in an open, custom binary format.

I think they have everything you've listed except cross-references.