Таблица денормализации - PullRequest
0 голосов
/ 15 мая 2019

Я должен денормализовать существующую таблицу и сохранить все данные, которые уже есть. Ранее моя структура таблиц была

TABLE A:
[id] INT IDENTITY(1,1)
[name] NVARCHAR(100)
[countryID] INT

TABLE B:
[id] INT IDENTITY(1,1)
[countryName] NVARCHAR(100)

Новая структура TableA:

TABLE A:
[id] INT IDENTITY(1,1)
[name] NVARCHAR(100)
[countryName] NVARCHAR(100)

Интересно, есть ли более элегантное решение, чем это

--BACKUP TABLE TO VARIABLE
DECLARE @backup TABLE (
            [Id] INT NOT NULL,
            [Name] NVARCHAR (1000) NOT NULL,
            [CountryId] INT NULL,
INSERT INTO @backup SELECT * FROM [dbName].[TableA]

--RECREATE THE TABLE WITH NEW STRUCTURE
DROP TABLE [dbName].[TableA]
CREATE TABLE [dbName].[TableA]
        (
            [Id] INT IDENTITY(1, 1) NOT NULL,
            [Name] NVARCHAR (1000) NOT NULL,
            [CountryId] NVARCHAR (100) NULL,
            CONSTRAINT [PK_TableA] PRIMARY KEY CLUSTERED 
            (
                [Id] ASC
            ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

SET IDENTITY_INSERT [dbName].[TableA] ON --Required to save original Id's

--INSERT DATA FROM BACKUP TABLE
INSERT INTO [dbName].[TableA]([Id],[Name],[CountryId])
SELECT 
backup.[Id],
backup.[Name],
[dbName].[TableB].[Name],
FROM @backup backup
LEFT JOIN [dbName].[TableB] on backup.[CountyId] = [dbName].[TableB].[Id]

SET IDENTITY_INSERT [dbName].[TableA] ON

Ответы [ 2 ]

3 голосов
/ 15 мая 2019

У разных людей может быть разный выбор.Но для меня я выберу эти шаги, чтобы сделать то же самое -

  1. BACKUP Table-A
  2. Измените Table-A и добавьте новый столбец "countryName"
  3. Обновите данные в столбце countryName, присоединившись слева к таблице-B
  4. Измените таблицу-A на столбец DROP "countryID"
  5. DROP-таблица B (на основе требования)

Примечание: я бы выбрал опцию Alter Table-A, чтобы избежать восстановления таблицы в случае потери данных.

1 голос
/ 15 мая 2019

Буду осторожен с твоим решением.Он не является поточно-ориентированным (то есть, если другие потоки модифицируют таблицы, вы можете потерять данные).Вы также рискуете потерять резервную таблицу, если что-то случится с базой данных - например, если база данных выйдет из строя после drop, но до insert.

Вы на самом деле просто добавляетеновый столбец TableA.Ну, вы можете сделать это напрямую:

alter tableA add column countryName varchar(100);

update a
    set countryName = b.countryName
    from tableA a join
         tableB b
         on a.CountyId = b.id;

Обе эти операции должны быть "безопасными" в базе данных.Я бы все еще сделал резервную копию производственной базы данных перед ее выполнениемТем не менее, они должны быть в порядке.

Единственное предостережение в том, что если TableA действительно большой, изменение таблицы может занять некоторое время.Возможно, вы захотите проверить это в блоке разработки / подготовки, прежде чем менять таблицу на производстве.

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