一个要求是,当我将C#对象持久化到数据库时,我必须在代码中决定数据库ID(代理主键)。
第二个要求是密钥的数据库类型必须是int或char(x)...所以没有uniqueidentifier或binary(16)等。
这些是不可改变的要求。
处理此问题的最佳方式是什么?
一个想法是base64编码的GUID看起来像“XSiZtdXcKU68QWe7N96Dig”。这些很容易在代码中创建,如果需要,我可以在URL中接受。但是对于所有主键和外键都是char(22)的性能(索引,大小)来说是否太昂贵了?我真的很喜欢这个想法。
另一个想法是创建一个数据库序列的代码版本,为我创建递增的整数。但我不知道这是否合理,需要一些指导以确保可靠性。序列发生器必须知道它已经到来以及我无法控制的线程等等。
我想没有涉及的表会超过1.000.000行...可能会少得多。
答案 0 :(得分:1)
你可以有一个名为“序列”的表。对于每个表,将有一个带有计数器的行。然后,当您需要另一个数字时,从计数器表中获取并递增它。把它放在交易中,你就会有独特性。
然而,当然,这会在性能方面受到影响。
答案 1 :(得分:0)
简单的递增int将是确保唯一性的最简单方法。如果您允许,这就是数据库将执行的操作。如果将表行设置为auto_increment,数据库将自动为您执行此操作。
这没有任何安全问题,但由于您将自己处理它而不是让数据库引擎处理它,因此您需要确保不会生成两次相同的ID。如果您使用单线程系统,这应该很简单,但如果您的程序是分布式的,那么您需要付出一些努力来确保唯一性。
答案 2 :(得分:0)
看到您有一个ASP.NET应用程序,您可以执行以下操作(希望并假设所有用户必须在使用您的应用程序之前对自己进行身份验证!):
再一次 - 你必须自己做更多的家务工作,并且总是容易发生事故(分配重复的用户ID,或者错误解释该用户的最高序号)。
我强烈建议尝试改变这些要求 - 有了这些要求,所有解决方案都将是次优的,而使用数据库处理这些将是完全无痛的。
马克
答案 3 :(得分:0)
对于1.000.000行以下的表格,我不会非常担心char(22)主键。当然,对于这种情况来说,理想的解决方案是每个对象都有一些独特的东西,你可以利用它来获得密钥,即使它是一个多部分密钥。下一个理想的解决方案是改变要求:)