SQL: нормализация кода / экспорт - импорт - PullRequest
0 голосов
/ 16 июля 2010

Я решил переписать базу данных, которая у меня плохо нормализована. Я создал новую базу данных, но теперь нужно переместить данные из старой базы данных в новую. Я не уверен, как именно это сделать, хотя. Например, в старой базе данных у меня есть таблица webDorms, которая выглядит следующим образом:

id (PK, int)
room_type (varchar) 
description (char) 
available (varchar) 
max_occupancy (varchar) 
current_occupancy (varchar) 
dorm_room (varchar) 
dorm_building (varchar) 
building_code (varchar) 

В новой базе данных я разделил это на две таблицы: Здания и Жилье. Корпус выглядит так:

id (PK, int) 
building (FK, int) 
room (nvarchar)
current_occupancy (int) 
max_occupancy (int) 
is_available (bit) 
gender (nvarchar) 
room_type (nvarchar)

Здания выглядят так:

id (PK, int) 
building_code (nvarchar) 
building_name (nvarchar)

Я вручную заново заполнил таблицу Buildings (в ней было около двадцати строк), но таблица Housing (которая наиболее похожа на предыдущую таблицу webDorms) содержит около трехсот строк - и я бы не стал переписывать все эти данные.

Какие-либо предложения о том, как лучше всего выполнить этот импорт?

Ответы [ 4 ]

2 голосов
/ 16 июля 2010

Если я упустил что-то очевидное в вашем вопросе, пожалуйста, дайте мне знать с комментарием, но что плохого в использовании запросов INSERT для копирования данных вместо их повторного ввода?

1 голос
/ 16 июля 2010

Это будет выглядеть примерно так:

INSERT INTO ['database'].dbo.[housing] (id, building, current_occupancy, max_occupancy, room_type, is_available)
  SELECT id, [building].id, cast(current_occupancy as int), cast(max_occupancy as int), room_type, CASE available WHEN 'Y' THEN 1 ELSE 0 END)
  FROM ['database'].dbo.[webDorms]
  INNER JOIN ['database'].dbo.[building] ON [building].building_code = [webDorms].building_code

[Комната] и [Пол] необходимо будет добавить вручную, или вы можете заполнить их значениями по умолчанию во время вставки.

Это, конечно, после того, как вы заполнили свою таблицу [building], что можно было сделать следующим образом:

INSERT INTO ['database'].dbo.[building] (building_code)
  SELECT DISTINCT building_code 
  FROM ['database'].dbo.[webDorms] 

Затем заполнив ваше [building_name] вручную (вместо ввода всех данных).*

1 голос
/ 16 июля 2010

вы хотели бы сделать что-то вроде этого:

SELECT CAST(current_occupancy AS int) AS current_occupancy,
       CAST(max_occupancy AS int) AS max_occupancy,
       CAST(available AS bit) AS available

Вам нужно взглянуть на книги в Интернете и, в частности, CAST and CONVERT .

Вы упомянули нормализацию как причину изменения дизайна таблицы, но вы еще не нормализовали все возможности. Здесь можно выбрать тип комнаты и пол, а также типы данных о максимальной и текущей вместимости достаточно велики, если только вы не хотите иметь комнаты, в которых могут проживать 2 миллиарда человек. : 0)

1 голос
/ 16 июля 2010

Это одна из причин, почему SQL имеет SELECT DISTINCT - нормализацию.

Два запроса SELECT DISTINCT из исходной таблицы должны создать результирующие две нормализованные таблицы.

У вас есть два подхода.

INSERT INTO new_table_1(...) AS SELECT DISTINCT a, b, c FROM old table
INSERT INTO new_table_2(...) AS SELECT DISTINCT d, e, f FROM old table

Или выполните два отдельных запроса, чтобы создать два отдельных файла извлечения (в формате CSV).Затем загрузите эти два файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...