在关系型数据库圈子里,一个常见的争论是:数据库表名应该用单数还是复数? 如果你有一个存储用户的表,这个表应该叫 user 还是 users?
使用复数的理由很直接:
-
这个表里存储的是多个用户。
-
在
FROM子句中读起来很自然:SELECT id, name FROM users;
使用单数的理由更微妙:
-
严格来说,我们命名的不是“表”,而是“关系”(relation)。 我们描述的是用户 ID、名字、地址等字段之间的关系。而关于用户数据的关系只有一个。 一旦我们描述了这种用户关系,它就可以用来存储多个用户。
-
在 SQL 查询的其他地方读起来更顺畅:
SELECT id, name FROM user JOIN country ON user.country_id = country.id WHERE country.name = 'Canada';如果
ON子句写成users.country_id,就没那么顺畅了。 -
存储数据的类名是单数(
User)。 因此如果数据库用复数,类与表就不一致。 而在很多 ORM(比如 Rails)里,框架会自动进行复数化,结果可能会出现像addresss这样的表名。 -
有些关系本身就是复数。 比如你有一个叫
UserFacts的类,用来存储用户的各种额外信息(年龄、喜好等)。那你该怎么命名数据库表呢?
最后一点其实是最有力的论据:只要有一个例外,就会破坏整个数据库模式的命名一致性。 而使用单数,就不会遇到这种问题 —— 无论现在还是以后。