数据库表名应该用单数还是复数?

75 阅读1分钟

在关系型数据库圈子里,一个常见的争论是:数据库表名应该用单数还是复数? 如果你有一个存储用户的表,这个表应该叫 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 的类,用来存储用户的各种额外信息(年龄、喜好等)。那你该怎么命名数据库表呢?


最后一点其实是最有力的论据:只要有一个例外,就会破坏整个数据库模式的命名一致性。 而使用单数,就不会遇到这种问题 —— 无论现在还是以后。