我有一个关于数据库表字段命名的实际问题。例如,我有两个表:
student (id int; name varchar(30))
teacher (id int, s_id int; name varchar(30))
两个表中都有'id'和"name"。在SQL语句中,如果没有表名前缀,则会对这两个字段产生歧义。有两种选择:
- 在SQL 'where'子句中使用表名作为字段的前缀
- 在表中使用带前缀的字段名称,以便在'where'子句中不使用前缀。
哪种方法更好?
我有一个关于数据库表字段命名的实际问题。例如,我有两个表:
student (id int; name varchar(30))
teacher (id int, s_id int; name varchar(30))
两个表中都有'id'和"name"。在SQL语句中,如果没有表名前缀,则会对这两个字段产生歧义。有两种选择:
哪种方法更好?
SomeTableNameThatsWayTooLong as long_table
即可。SELECT LT.Id FROM SomeTableNameThatsWayTooLong AS LT
对于非临时查询,您应该始终在每个字段前加上表名或表别名的前缀,即使字段名不含歧义。这可以防止如果有人向其中一个表添加新列导致歧义后查询出现问题。
这样,“id”和“name”就不会产生歧义了。但我仍然建议使用比“id”更具体的名称来命名主键。在您的示例中,我将使用student_id
和teacher_id
。这有助于防止连接时出现错误。当您遇到具有多个唯一键或多部分键的表时,您将需要更具体的名称。
值得思考这些问题,但最终一致性可能是更重要的因素。我可以处理围绕id
而不是student_id
构建的表,但我目前正在使用不一致的架构,其中使用了以下所有内容:id
、sid
、systemid
以及像taskid
这样的特定名称。那是最糟糕的情况。
foobar
列...是对fee
表、fi
表还是fo
表中的列的引用?(你可别让我去查找表定义以找出它所指的表。)但我的个人偏好是在主键(或唯一键)处将列命名为id
。 - spencer7593SELECT
t.name AS teacher_name,
s.name AS student_name
FROM
teacher AS t
INNER JOIN student AS s ON
s.id=t.s_id;
referenced_table_id
的模式来命名外键列。例如,使用 student_id
而不是 s_id
。除此之外,这就是我遵循的模式。 - spencer7593id
列,作为主键或唯一键的一致性,这对开发人员来说是一个好处...它允许按照“约定”编码,而不是使该列名称成为必须具有特殊代码的“异常”。当没有这种模式时,我看到的SQL语句是 ON fee.student_id = fo.student_id
... 这是外键到主键的连接吗?哪个表是主键?还是这是外键到外键的快捷连接?或者,SQL是错误的吗?我发现将id
列作为PK使得SQL更容易理解,并且使错误的SQL“看起来”就是错误的。 - spencer7593
id
用于表中的唯一键。当它是另一个表中引用student
表中的id
列的外键列的名称时,将使用列名student_id
。 - spencer7593