It could be problematic to have an identity column with a 0 value because you could pass in a value that evaluates to 0 (e.g. an empty string or single space). An error in your code or some other condition that doesn't pass a proper id, but that evaluates to 0, would wipe out the first entry in the table.<p>Identity columns are more closely tied with the data in the row than array indices are, so wiping out array index 0 is not as bad as wiping out a database row with id 0.<p>EDIT: Here's an example: <a href="http://sqlfiddle.com/#!2/dd3ed/6" rel="nofollow">http://sqlfiddle.com/#!2/dd3ed/6</a>
When things begin at 0, it's often because they're abstracting an offset baked into the data structure - array[0] is 0 steps from the start of the array, array[4] is 4, etc.<p>Databases aren't storing things based on offsets, they're mystical and strange under the hood (by design - we worry about the schema, the database engine worries about the implementation). IDs are meant to be unique and that's about it. As mentioned by someone else, it's probably best if we don't use a value like 0 that can be misinterpreted.
<a href="http://xkcd.com/163/" rel="nofollow">http://xkcd.com/163/</a><p>I think for most lay persons starting with one makes sense, but more technical folk learn to start with 0, so depending on who wrote it or who it was written for that usually determines the start index.
They are, if the column being indexed is an attribute of the entity represented that itself is 0-based.<p>Otherwise they generally aren't, because of what a database is.