我同意这已被过度使用,但它确实在 RDBMS 世界中占有一席之地。您没有指定数据库,这更像是一场哲学辩论,然后是任何实现,所以我将在下面的示例中使用 sql server。
auto_increment 或标识的最佳情况是,在很多情况下,它比自然键更有效且更易于使用,其中自然键是宽列或多列自然键。
让我们看下表。
CREATE TABLE TABLE_OBJECT (
Table_ID int identity(1,1),
Server_NME varchar(128),
Database_NME varchar(128),
Table_NME varchar(128)
)
CREATE TABLE COLUMN_OBJECT (
Column_ID int identity(1,1),
Table_ID int not null,
Server_NME varchar(128),
Database_NME varchar(128),
Table_NME varchar(128),
Column_NME varchar(128)
)
现在让我们说在这种情况下我们想要将两个表连接在一起并且我们没有身份。
select * from TABLE_OBJECT to
inner join COLUMN_OBJECT co on co.Server_NME = to.Server_NME
and co.Database_NME = to.Database_NME
and co.Table_NME = to.Table_NME
最糟糕的是,写它的效率也很低,我不得不读取 6*(128) 个字节来比较一行。
现在将其与以下的简单性进行比较。
select * from TABLE_OBJECT to
inner join COLUMN_OBJECT co on co.Table_id = to.Table_ID
在上面的例子中,我只需要读取 2*(4) 个字节来比较一行。当您有很多行时,这是一个巨大的差异。
然后还有简单的存储方面。
CREATE TABLE COLUMN_OBJECT (
Server_NME varchar(128),
Database_NME varchar(128),
Table_NME varchar(128),
Column_NME varchar(128)
)
相对
CREATE TABLE COLUMN_OBJECT (
Column_ID int identity(1,1),
Table_ID int not null,
Column_NME varchar(128)
)
其上的存储是身份版本 2*(4) + 128 字节与自然密钥版本 4*128 字节。
唯一性也可以通过对 table_id 和 column_nme 的唯一约束来保证。然后在父表中对 table_nme、database_nme、server_nme 进行唯一约束。老实说,虽然我也很可能创建了一个数据库表,并且表对 database_id 和 table_nme 有唯一的约束,但你明白了。如果为唯一索引选择了正确的列,则唯一性永远不会成为问题。
在大多数语言中,获取先前插入的身份或 auto_incremenet 的值也很简单。
select @@IDENTITY
or
select LAST_INSERT_ID()
每种语言都有获得最后一种语言的方法。