Этот дизайн не"идеально подходит для SQL", поскольку он нарушает основные правила нормализации базы данных.И ни одна реляционная база данных не поддерживает 200000 столбцов для одной таблицы (большинство из них имеют ограничение в пределах 1500-2000 столбцов)
Даже если число областей «фиксировано», в реляционной базе данных не должно бытьодин столбец для каждой «фиксированной» вещи.
Это классическое отношение «многие ко многим», которое обычно моделируется тремя таблицами.
Одна для пациентов и одна для регионов:
create table patient
(
id integer primary key,
... other columns
);
create table region
(
id integer primary key,
... other columns
);
Тогда вынужна таблица сопоставления между пациентами и регионами:
create table person_region_map
(
person_id integer not null references person,
region_id integer not null references region,
primary key (person_id, region_id)
);
Карта гарантирует, что каждая комбинация региона и человека встречается только один раз из-за первичного ключа в обоих столбцах.
Другой вариант - использовать функциональность JSON в реляционной базе данных, что довольно распространено в наши дни.Используется ли он для вас, во многом зависит от того, какой продукт СУБД вы используете.
В PostgreSQL вы можете думать о чем-то вроде этого:
create table patient
(
id integer primary key,
regions jsonb,
... other columns
);
Затем вы вставляете значение JSON, которое содержит карту ключ / значение для регионов.Это дает дополнительное преимущество, заключающееся в том, что если регион не назначен региону, он не занимает места:
insert into patient (id, regions)
values (42, '{"region1": 30, "region10": 9}');
С Postgres это можно довольно эффективно индексировать и запрашивать.