我想知道人们对数据库表中ID列的命名有何看法.

如果我有一个名为Invoices的表,它的主键是一个标识列,我会将该列称为InvoiceID,这样我就不会与其他表发生冲突,这是显而易见的.

在我工作的地方,他们把所有的ID列都称为ID.

所以他们会做以下事情:

Select  
    i.ID 
,   il.ID 
From
    Invoices i
    Left Join InvoiceLines il
        on i.ID = il.InvoiceID

现在,我看到了一些问题:

其他人对这个话题有什么看法?

推荐答案

ID是SQL反模式.

如果有许多表的ID为ID,那么报告就会变得更加困难.它模糊了含义,使复杂的查询更难阅读,并要求您使用别名来区分报告本身.

此外,如果有人愚蠢到在可用的数据库中使用自然连接,您将连接到错误的记录.

如果您想使用某些dbs允许的使用语法,那么如果您使用ID,就不能使用.

如果您使用ID,那么如果您碰巧复制了连接语法,那么很容易导致错误的连接(不要告诉我,从来没有人这么做过!)并忘记更改联接条件中的别名.

所以你现在有了

select t1.field1, t2.field2, t3.field3
from table1 t1 
join table2 t2 on t1.id = t2.table1id
join table3 t3 on t1.id = t3.table2id

你什么意思

select t1.field1, t2.field2, t3.field3 
from table1 t1 
join table2 t2 on t1.id = t2.table1id
join table3 t3 on t2.id = t3.table2id

如果使用tablenameID作为id字段,这种意外错误发生的可能性要小得多,也更容易找到.

Sql相关问答推荐

如何在SQL Server中列出从当前月份开始的过go 10年中的月份

分组多输出访问查询问题

如何在snowflake中进行SQL的反向填充

PostgreSQL:使用JSONB中的字段使用jsonb_to_Records()填充记录

在SQL中返回缺省值,即使查询不返回任何结果

对多个条件的SQL进行排名

数组列的postgres更新查询

Select 列组(按同一表格中的另一列分组)Laravel 10

使用拆分器将已分组的不同值连接在一起

如何使用jsonn_populate_record()插入到包含IDENTITY列的表中

将 json 列键映射到第二个表中的匹配列值

如何从postgresql中的项目映射(关联数组)设置值?

Postgres存在限制问题「小值」

所有列分组的简写?

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

插入行时的行安全策略问题

为什么 get_json_object() 无法从存储在 Hive SQL 表中的 JSON 中提取值?

如何防止 SQL 中的负收入值并将其重新分配到接下来的月份?

Athena:从字符串birth_dt列计算年龄

在时态表和非时态表之间使用 EXCEPT 的 SQL 子查询给出表达式错误数