Hi everyone,

As part of the multi-team AIP effort ([AIP-67][1]), I’m planning to begin work 
on updating the database schema to support multiple teams. Since this is a 
significant and potentially disruptive change, I wanted to first gather 
feedback on the proposed approach.

## Proposed plan

1. Introduce a UUID primary key on the `dag` table

Replace the current `dag_id` primary key with a new `id` column containing a 
generated UUID. This is similar to the change proposed in #43161, but applied 
to the `dag` table.

1. Update all foreign keys referencing `dag.dag_id`

Update foreign keys across all related tables to reference `dag.id` instead of 
`dag.dag_id`. Impacted tables include:

- dag_schedule_asset_alias_reference
- task_outlet_asset_reference
- dag_schedule_asset_reference
- asset_dag_run_queue
- dag_version
- dag_schedule_asset_uri_reference
- dag_tag
- dag_owner_attributes
- dag_warning
- dag_schedule_asset_name_reference
- deadline
- dag_code
- serialized_dag
- task_instance
- dag_run
- backfill
- rendered_task_instance_fields
- task_map
- xcom
- job
- log

1. Add `team_id` column to tables

* `dag`: Add `team_id` column and enforce a unique constraint on (`dag_id`, 
`team_id`).
* `slot_pool`: Modify the unique constraint to be on (`pool`, `team_id`) 
instead of `pool` alone.
* `connection`: Modify the unique constraint to be on (`conn_id`, `team_id`) 
instead of `conn_id` alone.
* `variable`: Modify the unique constraint to be on (`key`, `team_id`) instead 
of `key` alone.

I was also thinking adding the `team_id` column to the table `task_instance` 
for optimization/simplification purposes, to make queries simpler/more 
optimized. The scheduler makes a lot of queries on the task instance level and 
having the `team_id` in this table would simplify them. We can always decide 
when working on the implementation to add the column `team_id` to other tables 
if we find out this would simplify things.

Note: Some have suggested allowing variables and connections to be shared 
across teams. Personally, I believe introducing the concept of shared/global 
resources would add unnecessary complexity and potentially confuse users. That 
said, this can be revisited later. If we decide to support global/shared 
resources, we can introduce new tables to support that model.

## Alternative Approach

Instead of using UUIDs as primary keys, another option would be:

* Change the primary key of `dag` to a composite key (`dag_id`, `team_id`)
* Update all foreign keys accordingly

I’m personally not in favor of this approach, for the following reasons:

* It adds complexity to nearly all queries involving the `dag` table
* It may negatively affect database performance (though I’m not a DB expert)
* It requires specifying both `dag_id` and `team_id` to access a DAG
* We previously went down this path with `task_instance`, and eventually moved 
to UUIDs to simplify things—this feels like a good opportunity to learn from 
that experience

That said, I’m happy to discuss this further if others feel differently.

You can find more context and details on this topic in the multi-team airflow 
project plan Google doc [2].

Thanks,

Vincent

[1] 
https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-67+Multi-team+deployment+of+Airflow+components

[2] 
https://docs.google.com/document/d/11rKo5D2QpT5NvMtDR1RZDjaih5jT5H-dt0aepkfmXSE/edit?tab=t.0#heading=h.4c16fc5qa1w8

Reply via email to