Creating row-oriented and column-oriented tables in a database
In the Terraform context, a table is a resource. That is why, we describe database tables in independent blocks (resource "yandex_ydb_table"), specifying an internal link to the previously created database.
Description of the yandex_ydb_table resource
Example of creating a 4-column test table in an existing database:
resource "yandex_ydb_table" "test_table" {
path = "test_dir/test_table_4_col"
connection_string = yandex_ydb_database_serverless.database1.ydb_full_endpoint
column {
name = "a"
type = "Utf8"
not_null = true
}
column {
name = "b"
type = "Uint32"
not_null = true
}
column {
name = "c"
type = "Int32"
not_null = false
}
column {
name = "d"
type = "Timestamp"
}
primary_key = ["a","b"]
}
resource "yandex_ydb_table" "test_table" {
path = "test_dir/test_table_4_col"
connection_string = yandex_ydb_database_serverless.database1.ydb_full_endpoint
column {
name = "a"
type = "Utf8"
not_null = true
}
column {
name = "b"
type = "Uint32"
not_null = true
}
column {
name = "c"
type = "Int32"
not_null = false
}
column {
name = "d"
type = "Timestamp"
}
primary_key = ["a", "b"]
store = "column"
partitioning_settings {
partition_by = ["b", "a"]
}
}
Properties of the yandex_ydb_table resource fields:
path: Path within the database to where the table will be created. The table name is specified without the trailing slash (/). If there is no directory to host the table, it will be created automatically.connection_string: Path for connecting to the database. It is used together with theydb_full_endpointparameter, which contains the full path to the database:grpcs://ydb.serverless.yandexcloud.net:2135/?database=/ru-central1/b1gv7kfcttio********/etn66ecf1qbt********. For brevity and simplicity, you can use a link to the"yandex_ydb_database_serverless"resource with the ID and theydb_full_endpointparameter specified, e.g.,yandex_ydb_database_serverless.database1.ydb_full_endpoint.primary_key: Primary key of the table. The key can be composite.
Full list of the yandex_ydb_table resource fields:
| Field name | Type | Value | Description |
|---|---|---|---|
| path | string |
required |
Table path |
| connection_string | string |
required |
Connection string |
| column | array[column] |
required |
Column data type |
| family | array[family] |
optional |
Column group |
| store | string |
optional |
Table type. To create a column-oriented table, specify column. To create a row-oriented table, do not specify the store field. |
| primary_key | array[string] |
required |
Primary key of the table |
| ttl | ttl |
optional |
TTL Settings |
| attributes | map[string]string |
optional |
Table attributes |
| partitioning_settings | partitioning_settings |
optional |
Partitioning settings |
| key_bloom_filter | boolean |
optional |
Using the Bloom filter for primary key |
| read_replicas_settings | string |
optional |
Settings of replications for reading |
The yandex_ydb_table block contains nested column blocks that describe individual properties of columns, such as:
| Field name | Type | Description |
|---|---|---|
| name | stringrequired |
Column name |
| type | stringrequired |
Column data type. Uses YQL data types |
| family | stringoptional |
Column group |
| not_null | booleanoptionalThe default value is false |
The column cannot be NULL |
Example of a full column description:
column {
name = "column_name"
type = "Utf8"
family = "some_family"
not_null = true
}
Warning
Currently, you cannot delete a column using Terraform, you can only add one. To delete a column, first delete it at the database level (for example, using a YQL query), then remove the column from the configuration file.
You can group columns into families
DATA: Type of storage device for column data in this group. The acceptable values aressdandrot(named after HDD spindle rotation).COMPRESSION: Data compression codec. The acceptable values areoffandlz4.
To group columns into a family, add the family block at the same level with the column block:
family {
name = "my_family"
data = "ssd"
compression = "lz4"
}
Descriptions of family block fields:
| Field name | Type | Description |
|---|---|---|
| name | stringrequired |
Column group name |
| data | stringrequired |
Storage device type for the data in this column group |
| compression | stringrequired |
Data compression codec |
Here is an example of grouping two columns into a family:
resource "yandex_ydb_table" "test_table" {
path = "test_dir/test_table"
connection_string = yandex_ydb_database_serverless.database1.ydb_full_endpoint
column {
name = "a"
type = "Uint16"
family = "test_family_group"
not_null = true
}
column {
name = "b"
type = "Uint32"
family = "test_family_group"
not_null = true
}
family {
name = "test_family_group"
data = "ssd"
compression = "lz4"
}
}
YDB allows you to create a TTL columnDate, Datetime, Timestamp, Uint32, Uint64, DyNumber.
The TTL column is configured by the following block:
ttl {
column_name = "d"
expire_interval = "PT1H" # 1 hour
unit = "seconds" # For numeric column types (non ISO 8601)
}
Description of ttl field values:
| Field name | Type | Description |
|---|---|---|
| column_name | stringrequired |
TTL column name |
| expire_interval | stringrequired |
Time in ISO 8601 |
| unit | stringoptional |
Specified if the TTL column is of numericseconds, milliseconds, microseconds, nanoseconds. |
Partitioning of row-oriented tables
Partitioningpartitioning_settings parameter of the yandex_ydb_table resource.
Description of the partitioning_settings block fields
Here is an example:
resource "yandex_ydb_table" "test_table" {
path = "/test_dir/test_table_4_col"
connection_string = yandex_ydb_database_serverless.database1.ydb_full_endpoint
partitioning_settings {
auto_partitioning_min_partitions_count = 5
auto_partitioning_max_partitions_count = 8
auto_partitioning_partition_size_mb = 256
auto_partitioning_by_load = true
...
}
...
}
Full description of the partitioning_settings fields for row-oriented tables:
| Field name | Type | Description |
|---|---|---|
| uniform_partitions | numberoptional |
Number of pre-allocated partitions |
| partition_at_keys | stringoptional |
Partitioning by primary key |
| auto_partitioning_min_partitions_count | numberoptional |
Minimum possible number of partitions |
| auto_partitioning_max_partitions_count | numberoptional |
Maximum possible number of partitions |
| auto_partitioning_partition_size_mb | numberoptional |
Specifying auto partitioning by size |
| auto_partitioning_by_size_enabled | booloptional |
Auto partitioning by size (bool); enabled by default (true). |
| auto_partitioning_by_load | booloptional |
Auto partitioning by load (bool); disabled by default (false). |
Partitioning of column-oriented tables
Partitioning
In Terraform, column-oriented tables are partitioned using the parameters in the partitioning_settings section of the yandex_ydb_table resource.
Here is an example:
resource "yandex_ydb_table" "test_table" {
path = "test_dir/test_table_4_col"
connection_string = yandex_ydb_database_serverless.database1.ydb_full_endpoint
...
partitioning_settings {
partition_by = ["b", "a"]
}
}
Description of the partitioning_settings fields for column-oriented tables:
| Field name | Type | Description |
|---|---|---|
| partition_by | stringoptional |
Partitioning based on specified partition keys |
| auto_partitioning_min_partitions_count | numberoptional |
Number of partitions |