给MYSQL的id列命名

11
什么是为MySQL表命名主键列的最佳实践?我见过两种方法:
  1. 'id'
  2. tableName_id(其中tableName用表的名称替代)。
我认为只使用'id'就足够了,因为您仍然可以通过选择带有点和表名前缀的列名来唯一标识该列(例如,在“cars”表中选择'id'列,可以写为cars.id)。 或者我是不是想太多了?

1
哎呀?tableName_id通常用于外部关系字段,而不是用于表本身,对吧? - Pekka
这个问题已经被问了很多次。通常这样的问题只会引起争吵。 - Quassnoi
4个回答

6

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

member
    member_id
    member_alias
    ...

post
    post_id
    member_id
    post_text
    ...

现在我可以使用MySQL的USING语法将它们连接起来,并为每个连接节省一些字符:
SELECT post.*, member_id, member_alias FROM post
    INNER JOIN member USING (member_id)

当然,这一切大多是主观的。

如果两个表有多个关系,该怎么办? - symcbean
1
这确实非常主观,特别是考虑到您可以使用表名引用任何列:member.id和post.id。如果您的语法需要显式引用表,则会得到member.member_id和post.post_id,这似乎相当多余。 - Mark

2

MySQL没有特别的考虑因素,只是一个SQL数据库。所以问题变成了应该为SQL数据库使用什么命名约定。

请注意,您可以根据需要(在允许的名称范围内)对列进行任何命名,但在评估最佳命名选择时,请考虑以下几点:

  1. 名称如何与SQL语言特性 - 特别是连接 - 交互得多方便?
  2. 名称对理解有多大帮助?

关于1,请考虑以下几点:

  • USING子句的行为如何?
  • NATURAL JOIN子句的行为如何?
  • 当来自不同源表的非连接列具有相同名称并且被SELECT时,INNER JOIN的行为如何? (尽管SQL允许使用点分名称推迟冲突-但这不适用于子查询。)

关于2,请考虑,随着模式的演变,主要内容可能会变成外来的内容。一个可能变成很多。重命名列是否有助于基数更改?

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

TASK {task_id, task_created_date} -- 任务 task_id 创建于 task_created_date

TASK_DUE {task_id, task_due_date} -- 任务 task_id 到期于 due_date


1

我在当前表的主键上使用“ID”,并在外键字段中使用“tableName_id”,但通常这取决于个人喜好。

我曾在一些公司工作过,他们使用“tblMyTable”作为表名,并将其用作表中每个字段的前缀。但我不喜欢这样做。


1

我总是使用tablename_id。这样我就可以使用USING。

另外,如果你在多表连接中没有指定表别名,你的SQL语句会稍微清晰一些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接