Бекенд на C# Web Api

To Kaiten

Модели базы данных

Атрибуты

При создании моделей для базы данных часто применяются различные атрибуты для настройки свойств моделей. Эти атрибуты помогают задать правила и ограничения, которые будут применяться при создании и обновлении схемы базы данных, а также влияют на то, как данные будут сохраняться и извлекаться.

Ниже приведен пример таблицы с разными атрибутами и пояснениями к ним.

[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) [перевод]

Хабр — Руководство по проектированию реляционных баз данных. Каскадное удаление данных


Автор документа: Артём Ветик