powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Декомпозиция большой таблицы на несколько мелких
8 сообщений из 8, страница 1 из 1
Декомпозиция большой таблицы на несколько мелких
    #38372647
coderus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!
Я не большой спец. в БД и MySQL в частности - учусь, поэтому могу немного путаться в терминологии.
Скорее всего подобный вопрос уже был на форуме, но именно поэтому не нашел.

У меня есть внутренняя БД организации, которая досталась на новом месте работы.
Одна ОГРОМНАЯ таблица товаров, категорий и кучи различных свойств.
Свойства в этой таблице повторяются много раз(т.е. не уникальные).
Каждая позиция - отдельная строка этой таблицы.

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

Скорее всего и так понятно, чего я хочу, но все же приведу структуру.

1. - Структура существующей БД - только нужные в данной случае поля.
ГЛАВНАЯ ТАБЛИЦА

id int(10) unsigned NOT NULL AUTO_INCREMENT - (уникальный ИД позиции товара)
prod_name varchar(255) NOT NULL - название позиции(неуникальное)
prod_cat varchar(64) NOT NULL - название категории(неуникальное)
prod_prop01 varchar(64) NOT NULL - название свойства1(неуникальное)
prod_prop02 varchar(64) NOT NULL - название свойства2(неуникальное)

2. - Хотелось бы получить след. структуру
ГЛАВНАЯ ТАБЛИЦА

id int(10) unsigned NOT NULL AUTO_INCREMENT - (уникальный ИД позиции товара)
prod_name int(10) - ИД названия позиции(уникальный)
prod_cat int(10) - ИД категории(уникальный)
prod_prop01 int(10) - ИД свойства1(уникальный)
prod_prop02 int(10) - ИД свойства2(уникальный)

ТАБЛИЦА НАЗВАНИЙ
id int(10) unsigned NOT NULL AUTO_INCREMENT - (уникальный ИД Названия)
name varchar(64) NOT NULL - название позиции(уникальное!)

И такие же таблицы для - категории, свойства1 и свойства2.

Возможно ли это сделать только с помощью MySQL ?
Если нет, то подскажите общий алгоритм решения такой задачи.
Всем спасибо за внимание к этой банальщине.
...
Рейтинг: 0 / 0
Декомпозиция большой таблицы на несколько мелких
    #38372680
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
alter table main_table rename to omt;
create table prod_names(
  id_name int auto_increment primary key,
  name varchar(255),
  unique key IDX_prod_names__name(name))
  select distinct null id, prod_name from omt;
create table prod_categories(
  id_category int auto_increment primary key,
  category varchar(64),
  unique key IDX_prod_cat__category(category))
  select distinct null id, prod_cat from omt;
create table main_table(
  id int unsigned auto_increment primary key,
  prod_name int references prod_names(id_name),
  prod_cat int references prod_categories(id_category))
  select 
    o.id,
    n.id_name prod_name,
    c.id_category prod_cat
  from omt o
  join prod_names n on n.name=o.prod_name
  join prod_categories c on c.category=o.prod_cat;
-- индексы лучше не удалять для гарантии уникальности значений.
-- alter table prod_names drop key IDX_prod_names__name;
-- alter table prod_categories drop key IDX_prod_cat__category;
...
Рейтинг: 0 / 0
Декомпозиция большой таблицы на несколько мелких
    #38372681
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл алиасы полей в SELECT DISTINCT :(
...
Рейтинг: 0 / 0
Декомпозиция большой таблицы на несколько мелких
    #38372685
coderus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

Если не сложно хотя бы эту строчку подправьте. Почти понял в общих чертах как это делается - SQL очень интуитивный.
Приеду на работу, буду пробовать на тестовой БД.
Спасибо.
...
Рейтинг: 0 / 0
Декомпозиция большой таблицы на несколько мелких
    #38372689
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
alter table main_table rename to omt;
create table prod_names(
  id_name int auto_increment primary key,
  name varchar(255),
  unique key IDX_prod_names__name(name))
  select distinct null id_name, prod_name name from omt;
create table prod_categories(
  id_category int auto_increment primary key,
  category varchar(64),
  unique key IDX_prod_cat__category(category))
  select distinct null id_category, prod_cat category from omt;
create table main_table(
  id int unsigned auto_increment primary key,
  prod_name int references prod_names(id_name),
  prod_cat int references prod_categories(id_category))
  select 
    o.id,
    n.id_name prod_name,
    c.id_category prod_cat
  from omt o
  join prod_names n on n.name=o.prod_name
  join prod_categories c on c.category=o.prod_cat;
-- индексы лучше не удалять для гарантии уникальности значений.
-- alter table prod_names drop key IDX_prod_names__name;
-- alter table prod_categories drop key IDX_prod_cat__category;
...
Рейтинг: 0 / 0
Декомпозиция большой таблицы на несколько мелких
    #38376580
coderus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

Честно говоря не удалось собрать работающий запрос на основе вашего шаблона. Если есть возможность помогите разобраться.
Мне кажется вы тут напутали со скобками и вложенностью?
Или сделали это намеренно для обучающих, скажем так, целей;)
...
Рейтинг: 0 / 0
Декомпозиция большой таблицы на несколько мелких
    #38376592
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coderus,

Оки, вместо конструкции с одной командой create table ... (...) select...; можно использовать 2 команды: create table...(...); insert into...(...) select...; .

Вместе с тем, хотел бы посмотреть на структуру вашего варианта деления таблицы и причину, по которой он «не работающий» (например, сообщения об ошибках, или другая мотивация).
...
Рейтинг: 0 / 0
Декомпозиция большой таблицы на несколько мелких
    #38420914
coderus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007, огромное спасибо, полностью разобрался.
Пришлось наскоком вспоминать основные моменты SQL.
Удалось подогнать под свои данные, но только после того как разобрался в сути.
Это того стоило, теперь не так страшно за данные.

Ваш схематичный ответ получился концептуальным для такой задачи.
Чуть позже выложу листинги со всеми шагами по переезду на новую структуру БД.

Написал также для подстраховки, проверочные SQL-запросы - сверка ID в новых таблицах:)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Декомпозиция большой таблицы на несколько мелких
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]