Как нормализовать живую базу данных - PullRequest
0 голосов
/ 17 марта 2011

Мне нужно выполнить нормализацию структуры данных. У меня есть одна таблица с большим количеством избыточных данных (42 столбца)

несколько примеров:

files_shit (id, filename String, upload_user, user_name, tags text, ....)

и я хочу создать 3 таблицы file, user и tags

У меня почти 30 000 записей.

Как лучше всего скопировать данные из file_shit в files, users и tags и создать ссылки? (между тегами и файлами будет еще одна другая таблица file_tags)

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

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

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

 Sudo code eg : insert into files(columns..)Select <files columns> from files_shit group by primary_colum;

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

Лот зависит от новой схемы и отношений (которые вы не определили здесь четко),Надеюсь, это поможет.

РЕДАКТИРОВАТЬ - Поиск

У вас будет поле INT id для каждого table.eg.file_id.Они будут сгенерированы системой (в основном auto_increment).Проще говоря, этой информации нет в вашей текущей таблице.Таким образом, когда вы добавляете файл в таблицу файлов и он получает file_id, вам придется «искать» идентификатор этого файла, чтобы добавить его в таблицу пользователей, чтобы удовлетворить ваши отношения внешнего ключа (в зависимости от того, как они существуют),ПРОСТО EG - попробуйте добавить дополнительные столбцы file_id / tag_id в основную таблицу.

Сначала заполните таблицу тегов (в основном те, которые ни на что не ссылаются).

Заполните основные таблицы tag_id для каждой строки, присоединившись к таблице тегов (поиск).

UPDATE <mainTable> mT JOIN  tag_table tT on mT.tag_pk_column= tT.tag_pk_column

SET mT.tag_id = tT.tag_id

Теперь вставьте в файлы ... выберите file_pk_col, tag_Id group by file_pk_col

- это пример поиска длятаблица тегов.

0 голосов
/ 17 марта 2011

Самый простой способ - перевести базу данных в автономный режим, создать новые таблицы, включая все необходимые ограничения, и использовать INSERT INTO . . . SELECT column_list FROM old_table для заполнения новых таблиц.Некоторые данные, вероятно, не будут удовлетворять ограничениям в новых таблицах;вам придется это исправить.

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

...