例如,考虑这个分层模式。
假设所有 id 字段都是自动递增的主键,并且外键由[parent_table_name]_id约定命名。
问题
一旦数据库中有多个公司,那么公司将在它们之间共享所有主键序列。
例如,如果有两个公司行,customer_group表可能如下所示
| id | company_id |
-------------------
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | 1 |
-------------------
但它应该看起来像这样
| id | company_id |
-------------------
| 1 | 1 |
| 2 | 1 |
| 1 | 2 |
| 2 | 2 |
| 3 | 1 |
-------------------
这种行为也应该展示给customer和树中直接或间接引用company的任何其他表。
请注意,我很可能会为此创建第二个id列(命名为relative_id),保持唯一id列不变,因为这实际上主要用于显示目的以及用户将如何引用这些数据实体。
现在,如果这只是一个层次结构,那将是一个相对简单的解决方案。我可以创建一个表(table_name、company_id、current_id)和一个在插入任何表之前触发的触发器过程,将当前 id 递增 1 并将行的relative_id设置为该值。当company_id就在插入查询中时,这很简单。
但是那些不直接引用公司的表格呢?与本示例中的最低层次结构一样,workorder仅引用customer。
是否有一个干净、可重复使用的解决方案从“customer_id”一直爬到最终检索育儿company_id?
在每个 INSERT 上使用 SELECT 递归地提升层次结构对我来说听起来不太有吸引力,性能方面。
我也不喜欢只为这些表中的每一个添加一个外键到公司的想法,每个附加表的架构会变得越来越丑陋。
但这是我能看到的两个解决方案,但我可能没有在正确的地方寻找。