1

在简单的数据库设计中,实体表具有 ID(主要是自动递增)
但是有一些系统,例如 vtiger CRM,它使用主表来存储所有新创建的 IDS。
我的问题是:

  1. 所描述的方法有什么好处。
  2. 描述的方法的名称是什么,如果有的话。我的意思是设计师如何称呼这种方法?

moodle 也是这种方法的另一个例子。Moodle 中的一个示例:
mdl_context具有其他模块的所有 ID:

  • mdl_context - id - contextlevel - instanceid - 路径 - 深度

  • 值 - 115 - 50 - 17 - /1/84/90/115 - 4

instanceid是其他实体的ID并contextlevel显示表格,例如50是课程表的代码。
没有mdl_contextmdl_course有自己的ID,那么为什么`mdl_course存在?

4

2 回答 2

1

当您的数据库不支持自动增量列并且您必须自己实现自动增量值时,您可能会简单地考虑这一点。或者由于数据库中具体实现自增的限制,需要根据自己的业务规则自定义自增模块。

例如
何时gaps in the column values, are important to NOT Happens

考虑一下女巫的销售场景,您需要为 billing_ number 列提供确切的数字序列。使用自动递增方法会导致一些问题:

1- 如果有任何账单,将被拒绝,您将丢失一个数字 ( Rollback scenario)
2- 如果对帐单表执行 DELETE 操作(如果发生),您将丢失一个数字 ( Delete scenario)
3- 在一些分布式(集群)数据库环境,如 Oracle RAC(具有多个 RDBMS 节点)并使用 oracle 序列作为自动增量策略,我们必须使用 aCACHE interval来保持完整性,因此会再次丢失一些数字。

在这些情况下,您可以使用元数据表,例如crm_entity在其上保存每个表的最后使用值(或任何其他信息,如果需要)。锁定元数据表将是不可避免的,因此在繁重的 TPS 中,会出现性能问题。

于 2013-05-03T09:43:02.803 回答
0

SQL DBMS 通常提供一个键生成器功能,该功能可以直接与表中的列相关联,也称为标识或自动递增列。然而,这些具有某些缺点。语法通常是高度专有的并且难以使用,并且密钥生成器通常带有内置的限制,例如不允许更新或插入,或者每个表只允许一个这样的列。基于表的生成器函数通常只在插入时起作用,这意味着在插入行之前无法访问和使用该值,并且它们仅与一个表相关联,因此无法生成共享的键值和分布在表之间。

为了克服这些和其他限制,通常使用独立于表的密钥生成器。一些 DBMS(Oracle、SQL Server)通过独立于表的特殊序列生成器对象直接支持这一点,但其他 DBMS 不支持。因此,将序列生成表与其他表分开是一种有用的通用方法,可以在不依赖 DBMS 特定功能的情况下创建序列。

于 2013-05-03T11:53:41.907 回答