Генератор / Создание БД

Тут мини подсказка как сделать базу если вы никогда ее не делали.

Делать будем через Visual Studio

Запускаем Visual Studio без создания проекта:

тыкаем вверху

Ну все теперь давайте таблички создавать

Делать будем такую базу

Создаем таблицу Cats

Вводим названия столбцов и указываем тип. У nvarchar, еще прописываем максимальную длину типа nvarchar(100), ее если что можно будет всегда подкорректировать потом, можно указать nvarchar(MAX) тогда хватит на всю жизнь.

Также прописываем название таблицы в скрипте который генерируется снизу

тыкаем на поле id и справа внизу в свойствах меняем свойство:

ну и жмем кнопочку обновить

по идее должно открыться окошко в котором можно будет нажать Обновить базу данных, но у меня почему-то зависает, если вам не повезло так же как мне, то делаем следующим образом, копируем сгенерированный внизу запрос

CREATE TABLE [dbo].[Cats] (
    [id]   INT            NOT NULL IDENTITY,
    [name] NVARCHAR (100) NULL,
    PRIMARY KEY CLUSTERED ([id] ASC)
);

слева тыкаем Новый запрос

и вставляем сгенерированный запрос

тыкаем слева

ура табличка появилась

Создаем таблицу Locations

забиваем столбцы

не забываем активировать свойство Идентификатор у поле id, как делали выше в таблице Cats

У нас тут кстати ссылка таблицы на саму себя, оно в принципе и без внешнего ключа вполне может работать, но давайте все таки его добавим. Тыкаем справа на внешние ключи

пишем название типа FK_ParentLocationId_To_Location, то есть FK, потом название поля, потом To, затем название таблицы на которую ссылаемся Location. На самом деле это просто подход к неймингу и не на что не влияет.

Подкручиваем скрипт внизу

ну и тыкаем обновить

ну либо если снова начинает долго думать, то через создать Новый запрос скопировать и запустить

CREATE TABLE [dbo].[Locations] (
    [Id]                 INT            NOT NULL IDENTITY,
    [title]              NVARCHAR (100) NULL,
    [parent_location_id] INT            NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_ParentLocationId_To_Location] FOREIGN KEY ([parent_location_id]) REFERENCES [dbo].[Locations] ([Id])
);

Создаем остальные таблицы

Таблица Races

CREATE TABLE [dbo].[Races] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [title]       NVARCHAR (100) NULL,
    [location_id] INT            NULL,
    [dt]          DATETIME       NULL,
    CONSTRAINT [PK__Races__3214EC0790276EE8] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Races_Locations] FOREIGN KEY ([location_id]) REFERENCES [dbo].[Locations] ([Id])
);

Таблица RacesToCats

CREATE TABLE [dbo].[RacesToCats] (
    [Id]      INT IDENTITY (1, 1) NOT NULL,
    [race_id] INT NULL,
    [cat_id]  INT NULL,
    [time]    INT NULL,
    CONSTRAINT [PK__RacesToC__3214EC0706FB7597] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_RacesToCats_Cats] FOREIGN KEY ([cat_id]) REFERENCES [dbo].[Cats] ([id]),
    CONSTRAINT [FK_RacesToCats_Races] FOREIGN KEY ([race_id]) REFERENCES [dbo].[Races] ([Id])
);
1

Тут я показываю какая у меня база получилась. Так что если у вас еще нет своей, или вы ее недоделали то можете сориентироваться на мою (смотри подсказку).

Если же у вас уже база есть, то вам надо ее проверить и при необходимости подкрутить чтобы для нее были верны следующие утверждения

  1. У всех таблиц должен быть суррогатный первичный ключ, то бишь идентификатор: id, даже если уже есть естественный (ну типа там номер паспорта)
  2. Должна быть хотя бы одна таблица со связью (one-to-many), в моем примере это таблица Races, то есть гонки, у которая идет связь на Locations через location_id, такая связь характеризует место проведения гонки
  3. Должна быть хотя бы одна таблица которая связывает две (связь many-to-many), в моем примере это RacesToCats таблица
  4. В таблице many-to-many помимо полей которые связывают две таблицы (race_id, cat_id) должно быть еще поле которое характеризует эту связь (в моем случае это time – время забега котяры)
  5. Должна быть хотя бы одна таблица со связью на саму себя. В моем случае таблица Locations, связь parent_location_id. Используется для построения иерархии локаций, то есть, например, есть локация Квартира, внутри которой есть локация Кухня, Ванная, Гостиная и т.д.