Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpRlMtm 432 of 509 menu
◀ ▶

Связывание через таблицу связи в C#

Примеры раздела используют SQLite через пакет в файле проекта:

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net10.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.14" /> </ItemGroup> </Project>

Пусть юзер был в разных городах.

Тогда таблица с юзерами могла бы иметь следующий вид:

users
id name city
1 user1 city1, city2, city3
2 user2 city1, city2
3 user3 city2, city3
4 user4 city1

Так хранить данные неправильно - города нужно вынести в отдельную таблицу. Вот она:

cities
id name
1 city1
2 city2
3 city3

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

Понадобится так называемая таблица связи, которая будет связывать юзера с его городами.

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

Вот таблица связи:

users_cities
id user_id city_id
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 3 2
7 3 3
8 4 1

Таблица с юзерами будет хранить только имена юзеров, без связей:

users
id name
1 user1
2 user2
3 user3
4 user4
5 user5

Запросы

Запрос, который вытащит юзеров вместе с их городами, делает два соединения: первое присоединит к юзерам таблицу связи, а второе по связям присоединит города:

SELECT users.name as user_name, cities.name as city_name FROM users LEFT JOIN users_cities ON users_cities.user_id=users.id LEFT JOIN cities ON users_cities.city_id=cities.id

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

Пусть товар может принадлежать нескольким категориям. Распишите структуру хранения.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить