顺序号码是否必要?

5
我正在开发一个包含订单、发票、服务订单、票务等的winform (.NET)应用程序。
这些实体在编号时是否需要按顺序?我的看法是不需要。以订单为例,只有通过业务层后它才能有效,而在此过程中可能已创建、审核并保存了另一个编号为2的订单,而先前创建的编号为1的订单则未通过验证。
这似乎引发了分配订单号的层次问题,不是吗?
目前我使用带有实体标识符前缀的非连续编号。例如,订单使用OR-123。这是一个好主意吗?
谢谢

相关:

SQL Server中全局唯一但简单的标识符

8个回答

7
只有在符合业务需求的情况下才需要使用连续的ID。

2
如果您的数据库表的聚集索引在该ID字段上,并且插入速率使得始终在表的末尾进行插入,则可以考虑这种方法。 - richardtallent
即使使用GUID,密钥也可以“顺序”生成或不生成。一个适合索引,另一个则不太适合 :-) - user166390

5
顺序编号并非必要,某些情况下可能是个坏主意(例如在需要考虑猜测的安全意识系统中)。但让关系型数据库管理系统(RDBMS)处理这一问题相对常见——大多数支持IDENTITY自动递增类型(虽然在具有多个分布式主服务器的情况下会更加复杂)。当然,另一个选择是Guid——几乎不会出现重复的机会。
前缀方法非常方便快速识别编号,但您可以选择仅在上层db处添加“OR-”。

4

会计和总账人员喜欢使用连续的数字,如果数字缺失,他们想知道原因。这是一种会计实践,如果没有按规范执行,可能会给企业带来时间和金钱上的损失。


4

我认为我们应该区分技术ID和文档ID。可能会涉及到法律要求。例如,在瑞典,发票必须按照连续的顺序编号。

然而,如果我要设计一个发票系统,我可能会选择将技术ID与发票ID分开,最好没有任何逻辑(例如使用Guid)。


+1 我不一定支持使用GUID的可能选择,但这个答案确实指出了发票ID可能是一个独立的(商业)问题,与实现细节无关。例如,它只是一个需要根据需要公开的内容/位置/方式的问题。 - user166390

3
根据我在美国使用现成和定制会计系统的经验,会计师或审计员不需要连续编号。他们需要的是控制和审计能力的证明。如果删除了一项内容,必须有一个记录。删除内容的检测不是通过缺失的编号来跟踪的 - 毕竟,有其他种类的篡改可以避免要求连续编号,并且适当控制的证明远远超出此范围。
然而,我曾在墨西哥看到政府报销的这种要求。我认为他们使用它来避免向国家机构提交多个欺诈性请求。在我看来,这不是一种有效的内部控制方法,并且在第三方交互情况下捕捉欺诈的范围有限。
通常,在表中使用递增的整数ID(如IDENTITY)(或GUID - 但普通GUID不是这样递增的)作为代理主键,并对其进行聚集有助于提高SQL Server的性能。请注意,可能会使用完IDENTITY值,但事务失败或回滚,留下间隙。这个间隙通常不会被填补(尽管可以通过使用identity insert来填补)。
这里是一些COMB ID链接:

http://jeffreypalermo.com/blog/use-guid-comb-in-your-database-if-you-need-guid-keys-but-don-t-want-to-take-a-big-performance-hit/

http://www.informit.com/articles/article.aspx?p=25862

我们实际上对其进行了一些修改,与CSLA一起使用,并将其称为SmartGUID。 SmartGUID类公开了一个创建日期属性。不幸的是,我不再隶属于该项目或公司,因此无法访问源代码以准确地回忆起我们的技术。

在 SQL Server 中,如果有大量的订单数据,使用 GUID() 进行连接是否会消耗大量资源? - Saif Khan
1
是的,它们占用16个字节而不是4个。然而,在这16个字节中,您可以获得全局唯一性。我们制作了一个特殊的递增GUID,您还可以获取日期和时间(实际上是创建时间戳)-因此您几乎可以免费获得它。http://sqlblogcasts.com/blogs/martinbell/archive/2009/05/25/GUID-Ordering-in-SQL-Server.aspx - Cade Roux
Cade提出了一个很好的观点 - 您可以使用COMB技术而不是NewSequentialID()将日期/时间戳嵌入到GUID中,这样可以节省需要单独列的空间(只要您实际上不需要经常查询此元数据 - 提取它可能会很麻烦)。如果您希望业务层分配密钥,则COMB也是一种有用的技术,因为.NET没有内置等效于NewSequentialID()的功能。 - richardtallent
好的,让我找一些关于COMB ID设计的链接,并添加到答案中。 - Cade Roux

2

在使用该应用程序的国家,会计规则可能要求发票上有连续编号。

您的用户可能习惯于按照连续编号进行思考。也许员工们会打赌谁能够包装订单号为10000的订单?如果有人告诉他们由于新的计算机系统,这些赌注无效了,他们可能会感到非常沮丧。


2
如果你需要的字段是主键,那么即使你跳过了1到3等数字,按顺序插入数字仍然更快。但是,按顺序插入数字会引入安全问题:人们会“猜测”URL、意外转置数字或泄漏商业数据(例如你有多少用户等)。一种选择是使用GUID(唯一标识符类型)。它不太适合口头或键入,但足够随机和唯一。如果你使用SQL Server 2005,则新的SequentialID()函数将返回一个顺序GUID,既提供所需的唯一性,又可以快速插入表中。如果你选择使用某种随机数字,我建议你在表中也要有一个默认为GETDATE()的smalldatetime列,这样你就可以按创建日期对行进行排序和筛选。

在 SQL Server 中,如果有大量的订单数据,使用 GUID() 进行连接是否会消耗大量资源? - Saif Khan
唯一标识符类型是一个16字节的数字,是基于int的代理键的4倍大小。但在实践中,这些值是分布式的,因此在连接比较中“misses”很便宜,并且额外的存储要求可以忽略不计。作为一个附带的好处,唯一标识符类型可以在任何物理服务器上独立生成,因此比基于整数的键更容易扩展到多个,并且可以扩展到超过32位整数提供的40亿条记录。 - richardtallent

0

你应该问你的业务联系人是否真的需要数字是连续的,而不是问我们。

并告诉同样的业务人员,在大多数情况下,计算机系统很难对此提供完全可靠的保证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接