例として、この階層スキーマについて考えてみます。
すべてのidフィールドが自動インクリメントの主キーであり、外部キーは[parent_table_name]_id規則によって名前が付けられていると想定します。
問題
データベースに複数の会社が存在するとすぐに、会社はそれらの間ですべての主キーシーケンスを共有します。
たとえば、会社の行が2つある場合、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 |
-------------------
この動作は、顧客および直接または間接的に会社を参照するツリー内の他のテーブルにも表示される必要があります。
この目的のために2番目のid列( relative_idのような名前)を作成し、一意のid列をそのままにしておくことに注意してください。これは実際には主に表示目的であり、ユーザーがこれらのデータエンティティを参照する方法です。
これが階層の1つのレベルにすぎない場合、比較的単純なソリューションになります。テーブル(table_name、company_id、current_id)と、任意のテーブルに挿入する前に起動するトリガープロシージャを作成し、現在のIDを1ずつ増やし、行のrelative_idをその値に設定することができます。挿入クエリにcompany_idが含まれている場合は、簡単です。
しかし、会社を直接参照していないテーブルはどうでしょうか。この例の階層の最下位レベルのように、顧客のみを参照するworkorder。
'customer_id'からはしごを登って、最終的に子育てのcompany_idを取得するための、クリーンで再利用可能なソリューションはありますか?
各INSERTでSELECTを使用して階層を再帰的に上に移動することは、パフォーマンスの観点からはあまり魅力的ではありません。
また、これらのテーブルごとに会社に外部キーを追加するというアイデアも好きではありません。スキーマは、テーブルを追加するたびにますます醜くなります。
しかし、これらは私が見ることができる2つの解決策ですが、私は適切な場所を探していない可能性があります。