> For the complete documentation index, see [llms.txt](https://docs.snowddl.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.snowddl.com/advanced/architecture-overview/blueprints.md).

# Blueprints

<mark style="color:blue;">**Blueprints**</mark> are [Pydantic V2 models](https://docs.pydantic.dev/latest/concepts/models/) representing the desired state of objects in Snowflake account.

All standard blueprints are located in [`/blueprint/blueprint.py`](https://github.com/littleK0i/SnowDDL/blob/master/snowddl/blueprint/blueprint.py).&#x20;

For example:

```python
class TableBlueprint(SchemaObjectBlueprint):
    columns: List[TableColumn]
    cluster_by: Optional[List[str]] = None
    is_transient: bool = False
    retention_time: Optional[int] = None
    change_tracking: bool = False
    search_optimization: Union[bool, List[SearchOptimizationItem]] = False
```

### Inheritance

All blueprints are derived from `AbstractBlueprint` class.

Blueprints of schema objects (`TABLE`, `VIEW`, etc.) are derived from `SchemaObjectBlueprint`.

Blueprints of objects supporting dependency management within the same object type are derived from additional `DependsOnMixin`.

### Identifiers

Blueprints always use special objects called "identifiers" to describe unique object names in Snowflake. Identifiers are stored in [`/blueprint/ident.py`](https://github.com/littleK0i/SnowDDL/blob/master/snowddl/blueprint/ident.py).

The following types of identifiers are currently available:

* **Ident** - basic identifier with no additional features, normally used for column names;
* **AccountObjectIdent** - basic identifier which supports [env prefix](/guides/other-guides/env-prefix.md), used for account-level object names like `ROLE`, `WAREHOUSE`, `USER`.
* **DatabaseIdent** - identifier used specifically for `DATABASE` object type.
* **SchemaIdent** - identifier used specifically for `SCHEMA` object type.
* **SchemaObjectIdent** - complex identifier with multiple parts separated by `.` (dots), represents fully qualified name of schema-level objects like `TABLE`, `VIEW`.
* **SchemaObjectIdentWithArgs** - complex identifier with additional data types of arguments, represents fully qualified name of `FUNCTION`, `PROCEDURE` and other object types  supporting [overloading](https://docs.snowflake.com/en/sql-reference/udf-overview.html#overloading-of-udf-names) of names.
* **StageFileIdent** - complex identifier with additional path, represents fully qualified name for [`STAGE FILE`](/basic/yaml-configs/stage-file.md) special object type.
* **TableConstraintIdent** - complex identifier with additional list of columns, represents fully qualified name for table constraints, such as `PRIMARY KEY`, `UNIQUE KEY`, `FOREIGN KEY`.

It is very important to use the right type of identifier depending on specific use case. Identifier object is the core feature which makes it possible for [env prefix](/guides/other-guides/env-prefix.md) to work correctly.
