我刚遇到一个有点旧的数据库(和前端),它有一种有趣的方式来处理唯一 ID 方面的问题。
我有一个表,其中只有一列和一行存储一个整数(当前为 31448)。这个数字在Invoices
表上用作“InvoiceNo”,该Invoices
表也有一个唯一的 auto-inc id(当前为 2847)
它看起来有点像这样:
CREATE TABLE InvoiceNumber(
LatestId [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE Invoices(
InvoiceId [int] IDENTITY(1,1) NOT NULL,
InvoiceNo [int] NOT NULL,
Amount [decimal](18, 2) NULL
) ON [PRIMARY]
GO
除了实际上不是强制关系的 InvoiceNo 之外,两个表之间没有实际关系。
然后,当用户添加新发票时,前端执行以下操作:
public static void CreateInvoice(Invoice newInvoice)
{
try
{
using (var ctx = new DataContext)
{
var lastInvoice = (from lastNumber in ctx.SingleRowTable
select lastNumber).Single;
var newInvoiceNo = lastInvoice.InvoiceNumber +1; // Int
lastInvoice.InvoiceNumber = newInvoiceNo;
newInvoice.InvoiceNo = newInvoiceNo;
ctx.Invoices.InsertOnSubmit(newInvoice);
ctx.SubmitChanges;
}
}
catch (Exception x)
{
// Sleep now in the fire
}
}
因此,基本上,当创建新发票时,前端会请求 InvoiceNo(单行)表中的号码并加一 (+1) 该号码,然后成为新的发票号码以及最近使用的发票号码。
数据库中的其他表 (InvoiceItems) 引用 InvoiceId 而不是 InvoiceNo。
我想问题是:为什么有人会使用这种方法?它是反模式或设计错误还是有任何真正的实现?
我的想法是,出于某种原因,需要保留“真实世界”发票编号,因此他们决定运行额外的“唯一 ID”将是处理它的最佳方式。我想也许开发人员无法承受发票数量增加一千。(?) 也许。