Бекенд на C# Web Api
Модели базы данных
При создании моделей для базы данных часто применяются различные атрибуты для настройки свойств моделей. Эти атрибуты помогают задать правила и ограничения, которые будут применяться при создании и обновлении схемы базы данных, а также влияют на то, как данные будут сохраняться и извлекаться.
Ниже приведен пример таблицы с разными атрибутами и пояснениями к ним.
[Table("table_name", Schema = "games")]
[PrimaryKey(nameof(id), nameof(email), nameof(phone))] // первичные ключи
public class SomeTable
{
[Required] // обязательная колонка в таблице
public string id { get; set; }
[Required]
[EmailAddress] // строка должна быть в формате email
public string email { get; set; }
[Required]
[Phone] // строка должна быть в формате номера телефона
public string phone { get; set; }
[Required]
[MinLength(6)] // минимальная длина строки
public string name { get; set; }
[EnumDataType(typeof(Gender))] // колонка может принимать только значения перечисления Gender
public Gender gender { get; set; }
[Required]
[Column(TypeName = "timestamp")] // явно указываем тип колонки в БД
public DateTime created_at { get; set; }
}Список атрибутов из примера:
Table — имя таблицы в базе данных.
Schemaуказывает схему, в которую будет помещена таблица. Может быть удобно логически группировать связные таблицы в конкретной схеме. Можно не указывать схему и таблица будет размещена в схеме по умолчанию — public.Required — обязательная колонка. При добавлении записи, значение этой колонки не может быть null, иначе возникнет ошибка.
EmailAddress — при добавлении записи проверяет, что данная колонка имеет формат электронной почты.
Phone — строка должна иметь формат номера телефона.
MinLength — задает минимальную длину строки.
EnumDataType — позволяет ограничить колонку только значениями перечисления.
Column(TypeName = …) — данный атрибут позволяет более детально описывать колонку. В данном случае используется параметр TypeName, чтобы явно указать какой тип колонки использовать в БД. Это необходимо для миграции БД.
Также могут быть полезны следующие атрибуты:
[Range(15,100, ErrorMessage ="…")] — ограничивает числовую колонку значениями в определенном диапазоне.
StringLength(50, MinimumLength = 3) — задает максимальную и минимальную длину строки.
CreditCard — проверяет колонку на соответствие формату кредитной карты.
Url — проверяет колонку на соответствие формату url адреса.
DefaultValue — задает значение по умолчанию для колонки.
Первичные ключи задаются атрибутом класса PrimaryKey(…). Важно правильно задавать первичные ключи, так как они влияют на целостность данных и производительность поиска.
Вторичные ключи задаются атрибутом ForeignKey(…). Вторичные ключи необходимы для поддержания связей между таблицами. Они обеспечивают ссылочную целостность данных, облегчают управление сложными структурами данных, а также позволяют автоматически управлять каскадными операциями. Ниже приведен пример, где таблица player_profiles связана с таблицей player_credentials.

В демо-проекте в результате всех связей получилась следующая структура таблиц.

Хабр — Руководство по проектированию реляционных баз данных (4-6 часть из 15) [перевод]
Хабр — Руководство по проектированию реляционных баз данных (10-13 часть из 15) [перевод]
Хабр — Руководство по проектированию реляционных баз данных. Каскадное удаление данных
Автор документа: Артём Ветик