【发布时间】:2018-09-28 02:09:35
【问题描述】:
希望你们能帮助我集思广益,为我在工作中遇到的障碍提出一些想法。我会尽量在这里提供尽可能多的信息。
1) ProductSerialEnum - 这是一个包含各种产品类型的序列号枚举的表。它所做的是定义产品可以拥有的序列号范围。新类型将不断出现,因此这是当前示例
ProductTypeId SerialPrefix SerialStartRange SerialEndRange
--------------- ------------ -------------------- --------------------
1 2 2000000000 2999999999
2 1 1000000000 1999999999
3 4 4000000000 4999999999
4 3 3000000000 3999999999
5 501 5010000000 5019999999
6 500 5000000000 5009999999
7 601 6010000000 6019999999
8 600 6000000000 6009999999
... ... ... ...
2) 想要的结果
产品 - 这是产品属性表,我将简化为重要的部分。
这是我希望这张表的样子,但我遇到了符合我所有成功标准的问题。
ProductId ProductTypeId SerialNumber
----------- --------------- ------------
1 2 100000000
2 2 100000001
3 2 100000002
4 2 100000003
5 2 100000004
6 2 100000005
7 2 100000006
8 2 100000007
9 4 300000000
10 4 300000001
11 4 300000002
等等……
我的问题是填充 Products 表以像我上面发布的示例一样工作的最佳方法是什么。
当必须插入产品时,我会提供一个 ProductTypeId,并且在插入时,我应该生成一个序列号,该序列号由 SerialEnum 表中的范围定义。
这些序列号必须按 Enum 类型的顺序插入,正如您在我期望的示例中所见。它们的顺序是绝对关键的,我们不能刻录任何序列号,因为这些范围是我们分配的范围。
我最初的想法是生成一个插入 SP,它使用我的关键 ProductType 接收产品信息,然后保存该产品序列范围的最大序列号,然后简单地插入下一个值。
但是数据库接收到大量并发流量,所以我最担心的是序列号冲突和由于并发或锁定问题而跳过大范围的块。
我考虑过其他选项,例如可能对表进行分区以及处理 IDENTITY 列和范围,但是随着产品类型的范围如此频繁地增加,我无法跟上每次都持续运行分区方案的速度产品类型发生变化。
综上所述,每个插入到表中的产品都必须根据 ProductType 表中定义的序列号范围生成唯一且连续的序列号,而不会浪费序列号或由于并发问题而导致错误。
如果有人有一些经验或想法,如果你能把它们从我身上反弹出来,我将非常感激!
【问题讨论】:
-
当 ProductTypeID 2 的范围为 10000000 时,为什么您的预期数字以 2 开头
-
在你想要的结果中你显示
ProductTypeId2 和SerialNumber从2开始?不是要从1开始吗? -
几个问题:时间范围是什么——我们是在尝试执行原子操作,还是可以编写然后更新序列?失败怎么办 - 如果我们有多个更新发生,并且一个失败,那么该序列会发生什么。产品删除怎么办,或者这永远不会发生。你说你不想用完范围,这是否意味着你永远不会有差距?
-
@LoztInSpace 你是对的,我的例子不正确,我会更新它
标签: sql sql-server database database-design