Автоматизация нормализации таблицы - PullRequest
2 голосов
/ 21 июня 2010

У меня есть таблица с такой структурой (упрощенно):

artID: 1
artName: TNT
ArtBrand: ACME
...

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

:

artID: 1
artName: TNT
brandID: 1
...

таблица брендов

brandID: 1
brandName: ACME
brandInfo: xyz
....

В этой таблице слишком много брендов, чтобы сделать это вручную.Есть ли простой способ автоматизировать это?Я использую MySQL

Ответы [ 3 ]

2 голосов
/ 21 июня 2010

Как и в других ответах, вы можете использовать синтаксис INSERT ... SELECT, чтобы сделать что-то вроде этого:

INSERT INTO brands (brandName)
SELECT   artBrand
FROM     original
GROUP BY artBrand;

INSERT INTO articles (artName, brandID)
SELECT   o.artName, b.brandID
FROM     original o
JOIN     brands b ON (b.brandName = o.artBrand);

Контрольный пример:

CREATE TABLE original (artID int, artName varchar(10), artBrand varchar(10));
CREATE TABLE articles (artID int auto_increment primary key, artName varchar(10), brandID int);
CREATE TABLE brands (brandID int auto_increment primary key, brandName varchar(10));

INSERT INTO original VALUES (1, 'TNT1', 'ACME1');
INSERT INTO original VALUES (2, 'TNT2', 'ACME1');
INSERT INTO original VALUES (3, 'TNT3', 'ACME1');
INSERT INTO original VALUES (4, 'TNT4', 'ACME2');
INSERT INTO original VALUES (5, 'TNT5', 'ACME2');
INSERT INTO original VALUES (6, 'TNT6', 'ACME3');
INSERT INTO original VALUES (7, 'TNT7', 'ACME3');
INSERT INTO original VALUES (8, 'TNT8', 'ACME3');
INSERT INTO original VALUES (9, 'TNT9', 'ACME4');

Результат:

SELECT * FROM brands;
+---------+-----------+
| brandID | brandName |
+---------+-----------+
|       1 | ACME1     |
|       2 | ACME2     |
|       3 | ACME3     |
|       4 | ACME4     |
+---------+-----------+
4 rows in set (0.00 sec)


ELECT * FROM articles;
+-------+---------+---------+
| artID | artName | brandID |
+-------+---------+---------+
|     1 | TNT1    |       1 |
|     2 | TNT2    |       1 |
|     3 | TNT3    |       1 |
|     4 | TNT4    |       2 |
|     5 | TNT5    |       2 |
|     6 | TNT6    |       3 |
|     7 | TNT7    |       3 |
|     8 | TNT8    |       3 |
|     9 | TNT9    |       4 |
+-------+---------+---------+
9 rows in set (0.00 sec)
1 голос
/ 21 июня 2010

Создание таблицы брендов должно быть довольно простым:

CREATE TABLE brands ( 
  id INT PRIMARY KEY AUTO_INCREMENT, 
  brand_name VARCHAR(50), 
  brand_info VARCHAR(200)
);

INSERT INTO brands VALUES (brand_name)
SELECT ArtBrand FROM Table
GROUP BY ArtBrand;

Подобная история с созданием отношений между вашей исходной таблицей и таблицей новых брендов, только то, что выражение select во вставке будет выглядеть так:

SELECT t.artId, b.id 
FROM table t JOIN brands b ON (t.ArtBrand = b.brand_name)
1 голос
/ 21 июня 2010
  1. Я бы использовал create table as select ... синтаксис для создания брендов таблица сгенерированных идентификаторов
  2. создайте столбец brand_id и заполните его сгенерированными идентификаторами из таблицы брендов, используя существующие столбцы брендов в таблице артикулов.
  3. удалить столбцы бренда из таблицы артикулов, за исключением, конечно, brand_id
  4. создать внешний ключ ...
...