私はそれが使い古されていることに同意しますが、それはRDBMSの世界に存在します。あなたはデータベースを指定しませんでした、そしてこれはどんな実装よりも哲学的な議論であるため、以下の私の例ではSQLサーバーを使用します。
auto_incrementまたはidentityの最良のケースは、ワイドまたはマルチ列の自然キーである多くの場合、自然キーよりもはるかに効率的で使いやすいことです。
以下の表を見てみましょう。
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)
)
ここで、このシナリオで2つのテーブルを結合したいとしますが、IDがありません。
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
書くのが面倒であることに加えて、1行を比較するために6 *(128)バイトを読み取らなければならなかったのも非常に非効率的です。
次に、それを次の単純さと比較します。
select * from TABLE_OBJECT to
inner join COLUMN_OBJECT co on co.Table_id = to.Table_ID
上記の例では、1つの行を比較するために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)
)
このストレージは、IDバージョン2 *(4)+ 128バイトであるのに対し、自然キーバージョンは4*128バイトです。
table_idとcolumn_nmeに一意性制約を設定することで、一意性を保証することもできます。次に、親テーブルで、table_nme、database_nme、server_nmeに一意の制約を設定します。正直なところ、私はデータベーステーブルを作成した可能性が高く、テーブルにはdatabase_idとtable_nmeに対する一意の制約がありますが、あなたはその考えを理解しています。一意のインデックスに対して適切な列が選択されている場合、一意性が問題になることはありません。
以前に挿入されたIDまたはauto_incremenetの値を取得することは、ほとんどの言語でも簡単です。
select @@IDENTITY
or
select LAST_INSERT_ID()
すべての言語には、最後の言語を取得する方法があります。