Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Декомпозиция большой таблицы на несколько мелких / 8 сообщений из 8, страница 1 из 1
21.08.2013, 02:42:18
    #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
21.08.2013, 07:52:12
    #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
21.08.2013, 07:55:44
    #38372681
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпозиция большой таблицы на несколько мелких
Забыл алиасы полей в SELECT DISTINCT :(
...
Рейтинг: 0 / 0
21.08.2013, 08:03:30
    #38372685
coderus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпозиция большой таблицы на несколько мелких
Cygapb-007,

Если не сложно хотя бы эту строчку подправьте. Почти понял в общих чертах как это делается - SQL очень интуитивный.
Приеду на работу, буду пробовать на тестовой БД.
Спасибо.
...
Рейтинг: 0 / 0
21.08.2013, 08:09:38
    #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
24.08.2013, 16:17:35
    #38376580
coderus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпозиция большой таблицы на несколько мелких
Cygapb-007,

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

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

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

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

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


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