mysql—使用中央id存储或基于表分配id哪个更好

c0vxltue  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(378)

在许多erp系统(本地)中,我看到数据库(通常是mysql)使用中央密钥存储(资源标识)。为什么?
i、 e.在数据库中,维护一个特殊表,用于生成id,该表将有一个单元格(第一个单元格),该单元格将有一个分配给后续元组的数字(id)(即,为同一数据库中的所有表生成公共id)。
此外,此表中还插入了上次插入的批次详细信息的条目。i、 e.当表中插入5个元组时,假设批中项目的最后一个id是x,那么表(中央密钥库)中的一个条目也会像('',x)一样插入。
这种建筑有什么意义吗?
在哪里可以找到通用的大规模定制erp系统的案例分析?

f2uvfpb9

f2uvfpb91#

如果我理解正确的话,您可能会问为什么有人会替换只对表唯一的ID
表clients(id\u client auto\u increment,name,address)
表产品(id\产品自动增量、名称、价格)
表订单(id\订单自动增量、id\客户机、日期)
表order\u details(id\u order\u details auto\u increment,id\u order,id\u product,amount)
全局ID在整个数据库中是唯一的
表对象(id自动增量)
表客户端(id\对象、名称、地址)
表产品(id\对象、名称、价格)
表顺序(id\u object,id\u object\u client,date)
表order\u详细信息(id\u object、id\u object\u order、id\u object\u product、amount)
(当然,您仍然可以调用这些id\u产品等,而不是id\u对象。我只是用id\u object这个名字来澄清。)
第一种方法是常见的方法。在表中插入新行时,将获得该表的下一个可用id。如果两个会话要同时插入,则必须短暂等待。
因此,第二种方法导致会话在每次需要插入数据时都等待轮到它们,而不管是哪个表,因为它们都从objects表中获取id。最大的优点是,在导出数据时,您有全局引用。假设你出口订单,收件人告诉你:“我们对你的订单细节有问题12345。你的数据肯定有问题”。如果你能告诉他们“12345不是一个订单明细id,而是一个产品id,你在导入产品时有问题吗,或者你能告诉我这是关于一个订单明细id吗?”而不是查看一个订单明细记录几个小时,恰好有编号12345,而这与问题无关,这不是很好吗?
也就是说,使用第一种方法并将uuid添加到所有用于外部通信的表中可能是更好的选择。没有争夺下一个身份证,通信中仍然没有错误的身份证:-)

nfeuvbwi

nfeuvbwi2#

这是数据仓库中常用的策略,用于跟踪数据加载成功或失败后的批次号,如果数据加载失败,则在批次控制表中会显示“”、“批次号”和“错误代码”等字样,因此,进一步的加载逻辑可以决定如何处理故障,并且可以轻松跟踪加载,如果您想重新检查,我们可以存档数据。这个id通常由数据库中的一个序列生成,一句话,它主要用于监视目的。
有关详细信息,请参阅此链接

ttisahbt

ttisahbt3#

这种设计的缺点是在插入新数据时会给中心表带来巨大的负载。这是一个内在的瓶颈。
一些“优势”是:
在系统中任何地方找到的任何资源id都可以很容易地识别,而不考虑类型。
如果表中有任何文本(如名称或描述),则所有文本都是集中的,便于多语言支持。
外键引用可以跨多种类型工作。
第三个并不是真正的优势,因为它有一个缺点:无法为外键引用指定特定类型。
堆栈溢出不是请求特定非现场资源的适当位置。也就是说,我不知道有谁能解决这个具体问题。您可能会在供应商网站上找到白皮书,其中对这一问题进行了一些讨论。

ht4b089n

ht4b089n4#

还有其他几种技术,每种都有优点和缺点。但让我先指出两种技术,它们在扩展过程中的某个时候撞到了砖墙。假设您有数十亿个项目,可能通过分片或其他技术分散在多个服务器上。
砖墙#1:uuid很方便,因为客户端可以创建它们,而无需向中心服务器请求值。但是uuid是非常随机的。这意味着,在大多数情况下,每个引用都会导致磁盘命中,因为不太可能缓存id。
砖墙#2:询问中央服务器,它有一个 AUTO_INCREMENT 在掩护下发放身份证。我看了一个社交媒体网站,它什么也不做,只是收集图片分享,因为这个崩溃。尽管有一个服务器的唯一目的是分发数字。
解决方案1:
这里有一个(几种)解决方案可以避免大多数问题:有一个一次分发100个id的中央服务器。当一个客户用完了它所给的100后,它要求一个新的批次。如果客户端崩溃,最后100个客户端中的一些将“丢失”。哦,好吧;没什么大不了的。
这种解决方案是砖墙的100倍以上。与砖墙1相比,ID的随机性要小得多。
解决方案2:每个客户机可以生成自己的64位半连续ID。该数字包括版本号、部分时钟、重复数据消除部分和客户机id。因此,它大致按时间顺序(全球范围)排列,并保证是唯一的。但对于几乎同时创建的项,仍然具有良好的引用位置。
注意:我的技术可以被个别表使用,也可以作为所有表的uber编号。这种区别可能是你真正的问题(其他的答案则说明了这一点。)

相关问题