2010-11-28 초안.
2013-07-15 MongoDB 관련 추가.
2019-01-29 Gist에 옮기며 윤문.
2019-02-05 워드프레스에 옮김.
2019-07-08 Velog에 옮김.

짧은 결론

테이블 이름을 단수로 하면 여러 가지 문제를 피할 수 있습니다.

테이블 이름을 두고 성전이 벌어지는 이유

어떤 사람들은 테이블에 들어가는 레코드들 각각에 집중해 생각합니다.
테이블 이름을 복수로 쓰고 싶어집니다.

어떤 사람들은 테이블을 하나의 주머니로 생각합니다.
테이블 안에 많은 것이 들어가더라도 단수로 쓰고 싶어집니다.

더 구체적으로 보면,

어플리케이션 개발자의 경우

OOP 에서는 집합 연산을 하는 경우가 많지 않습니다.
List users 를 가지고 집합 연산을 하지 않습니다.
주로 루프를 돌려서 리스트에 들어있는 오브젝트 각각을 처리합니다.
해서 OOP 로 어플리케이션을 개발하는 사람들은 테이블 이름도 복수로 쓰고 싶어합니다.

데이터베이스 관리자들의 경우

이분들은 테이블을 한 덩어리로 봅니다.
SQL 은 집합을 다루는 언어이지 개별 튜블을 다루는 언어가 아닙니다.
테이블 이름이 User 일 때 이분들 머리속에서는 User 가 자동으로 User Table 로 변환됩니다.
즉, User 에는 이미 복수 의미가 있는 것입니다.
때문에 User 를 Users 로 하면 의미 중복이 된다고 생각합니다.
사과 한 봉지라고 하지 사과들 한 봉지라고 하지 않습니다.
해서 데이터베이스 관리자들의 경우 테이블 이름을 단수로 하고 싶어합니다.

테이블이 많아지면 복수로 처리하기 힘들다

Users, Posts, Comments 수준의 경우라면 복수로 해도 큰 문제는 없습니다.

테이블 몇 백 개가 등장하는 큰 시스템의 경우는 문제가 달라집니다.
현업을 반영한 테이블 명이 이런 식이 될 수 있습니다.
KOS143, KOS144, KOS145, JHL01, JHL02, …
이런 이름에 s 를 붙이는 것은 적합하지 않아 보입니다.

테이블이 OOP로 오면 복수로 한다

DB 에서는 집합연산을 주로 하므로 테이블 이름을 단수로 하는 것이 무난합니다.
하지만 OOP 에서는 결과 리스트를 받아서 각 오브젝트를 따로 다루게 됩니다.
해서 OOP 에서 결과 리스트 이름은 복수로 하는 것이 무난합니다.
User 테이블의 데이터가 Java 로 오면 List users 가 되는 식입니다.

MongoDB 의 경우

MongoDB 에서는 집합 언어, SQL 을 하용하지 않습니다.
디비 수준까지 OOP, JavaScript 를 사용합니다.
JavaScript 에서는 테이블 이름을 복수로 보려는 경향이 훨씬 강합니다.
해서 MongoDB 를 사용하는 경우에는 모든 티어간 통일성을 위해
MongoDB Collection 이름을 복수로 하는 것이 무난합니다.