2010-11-01 81 views
7

命名作为mysql表主键的列的最佳做法是什么?我已经看到了两种方式:命名MYSQL id列

  1. “身份证”
  2. tableName_id(其中tablename是代替表的名称)。

我以为只要id就足够了,因为你仍然可以通过选择由一个句点和表名(即表'汽车'中'id''列'')的列来唯一标识列,你可以选择它作为cars.id)

或者我过度思考这一切?

+1

咦是因为? 'tableName_id'通常用于外部关系字段,而不是表格本身,是吗? – 2010-11-01 11:12:03

+0

这已被问了很多次。通常这些问题只会导致火焰。 – Quassnoi 2010-11-01 11:12:44

回答

4

我通常将它们命名为[tblname] _id。原因很简单。比方说,我有两个表:

member 
    member_id 
    member_alias 
    ... 

post 
    post_id 
    member_id 
    post_text 
    ... 

现在我可以使用语法MySQLs加入他们的行列,并保存一些字符为每个加盟:

SELECT post.*, member_id, member_alias FROM post 
    INNER JOIN member USING (member_id) 

当然,这是所有主要是主观的。

+0

如果2个表有多个关系会怎么样? – symcbean 2010-11-01 13:39:58

+0

这确实很主观,特别考虑到你可以使用表名引用任何列:member.id和post.id.如果你的语法需要显式引用表,你会得到member.member_id和post.post_id,这看起来很多余。 – Mark 2014-10-01 20:32:52

1

我使用“ID”作为当前表的主键和tableName_id作为外键字段,但通常归结为个人偏好。

我曾在使用tblMyTable作为表名的公司工作,然后将它用作表中每个字段的前缀。我不喜欢这样做。

1

我总是去tablename_id。这样我可以使用USING。另外,如果你不好,并且没有在多表连接中指定表别名,那么你的sql会稍微更清晰一些。

2

除了作为一个SQL数据库之外,MySQL不会带来任何特定的考虑因素。所以问题变成了什么命名约定应该用于SQL数据库。

注意到你真的可以命名任何你喜欢(允许名称的范围内),评估的名字的时候最好选择,考虑列:

  1. 如何方便地将名字与SQL语言功能互动 - 特别加入?
  2. 这些名字有助于理解吗?

关于1,审议:

  • 如何使用该条款的行为?
  • NATURAL JOIN子句的行为如何?
  • 如果INNER JOIN在来自不同源表的非连接列具有相同名称并被选择时如何工作? (尽管SQL允许虚线名称推迟冲突 - 这不会延伸到子查询。)

关于2,考虑到随着您的模式的发展,初级可能会变成外来的。什么是可能会变得很多。是否有助于重新命名列,因为基数发生了变化?

最后,考虑一个单列主键并不总是一个人工键。在这个例子中它实际上可能是一个外键(1-1关系):

TASK {TASK_ID,task_created_date} - 任务与TASK_IDtask_created_date

TASK_DUE {TASK_ID创建, task_due_date} - 与任务TASK_IDDUE_DATE