Гость
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / "Нормализация" данных / 5 сообщений из 5, страница 1 из 1
08.09.2003, 17:09
    #32258915
-=Alexey=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Нормализация" данных
Есть таблица T1:(Код,Регион,Клиент,Продукт) все кроме Кода текст.
Есть процесс "нормализации" преобразование и копирование данных в таблицу T2 (Код, RegionID, ClientID, ProductID) с паралельным заполнением справочников по Регионам, Клиентам и Продуктам. {xxxID - целочисленные типы}

в настоящий момент используется курсор по таблице T1, который на каждом шаге по таблицам справочника возвращает из текстового представления - ID (если нет такого значения, добавляет)

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

но все равно это работает медлено, подскажите как можно оптимизировать.
...
Рейтинг: 0 / 0
08.09.2003, 19:01
    #32259105
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Нормализация" данных
Вытащить все неповторяющиеся названия Регион,Клиент,Продукт по очереди и вставить их в соответствующие таблицы. Потом апдэйтим таблицу через связку названия тут и в соответствующей справочной таблице, беря ID из справочника и внося в основную. И так для всех. Это будет очень быстро.
...
Рейтинг: 0 / 0
08.09.2003, 19:09
    #32259112
Jinn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Нормализация" данных
Таблицу Т1 делаешь как представление (VIEW). Вешаешь на него триггер, который при заполнении этого представления элементарго вставляет значения в справочники (с предварительной проверкой на имеющиеся записи) или берет значения из этих справочников. Примерно так^
---------------
function GetRegion(in_RegName) return integer
ValID integer
begin
select RegID into ValID
from Region_Table
where Upper(Region_Name)=Upper(in_RegName);
return ValID
exception
when No_Data_Found then
insert into Region_Table values (seq_reg_id.nextval,in_RegName);
commit;
return seq_reg_id.curval;
when Others then
return 0;
end;
---------------
...
Рейтинг: 0 / 0
08.09.2003, 22:43
    #32259206
Дмитрий Мыльников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Нормализация" данных
Как бы сделал я.
Естественно, что по полям Регион,Клиент и Продукт завёл бы вторичные индексы.
Далее сформировал все справочники, выполнив запрос типа:

insert ТРегион (РегионИмя) select distinct Регион from T1
insert ТКлиент (КлиентИмя) select distinct Клиент from T1
insert ТПродукт (ПродуктИмя) select distinct Продукт from T1

при этом поля RegionID, ClientID и ProductID в справочниках должны быть либо автоинкрементные (самогененрирующиеся), либо их необходимо будет потом сформировать.

А когда справочники готовы, то можно и таблицу T2 формировать. Причём тут, возможно, тоже проще делать не замену влоб, когда "курсор по таблице T1", а сначала внести в T2 все значения КОД, а потом получать список всех кодов с одни и тем же регионом и у них устанавливать RegionID. При этом, естетсвенно, я двигаюсь по справочнику регионов, а не по T1. Получается запрос типа

update T2 set RegionID=[число] where КОД in select КОД from T1 where Регион=[строка]

значения [число] и [строка] берём из српавочника регоинов и повторяем запрос в цикле прохода по справочнику Регионов.

С остальными полями аналогично.

Ускорение будет хотя бы за счёт того, что уменьшится количесвто обращений к серверу и количество записей в журнале. Да и на многих серверах сократится количество транзакций (и соответсвенно, накладных раходов на открытие/закрытие транзакции), осоебнно если вы в явном виде не указываете начало/конец транзакции, а пользуетесь встроенными по умолчанию в среду разработки механизмами.

Кстати, а в чём данные хранятся?
...
Рейтинг: 0 / 0
09.09.2003, 00:16
    #32259228
::xcom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Нормализация" данных
MS SQL 7.0
если быть точным таблицы:
Код: plaintext
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.
26.
27.
CREATE TABLE [dataSale] (
	[SaleID] [int] IDENTITY ( 1 ,  1 ) NOT NULL ,
	[SaleOperationID] [smallint] NULL ,
	[SaleProduct] [nvarchar] ( 255 ) COLLATE Cyrillic_General_CI_AS NULL ,
	[SaleRegion] [nvarchar] ( 255 ) COLLATE Cyrillic_General_CI_AS NULL ,
	[SaleQnty] [int] NULL CONSTRAINT [DF_dataSale_SaleQnty] DEFAULT ( 0 ),
	[SaleClient] [nvarchar] ( 255 ) COLLATE Cyrillic_General_CI_AS NULL ,
	[SaleClientAddress] [nvarchar] ( 255 ) COLLATE Cyrillic_General_CI_AS NULL ,
	CONSTRAINT [PK_dataSale] PRIMARY KEY  NONCLUSTERED 
	(
		[SaleID]
	)  ON [PRIMARY] 
) ON [PRIMARY]
GO

CREATE TABLE [dataSale] (
	[SaleID] [int] IDENTITY ( 1 ,  1 ) NOT NULL ,
	[SaleMonth] [int] NOT NULL ,
	[SaleDistributor] [smallint] NOT NULL ,
	[SaleRegion] [smallint] NOT NULL ,
	[SaleProduct] [smallint] NOT NULL ,
	[SaleQnty] [int] NOT NULL CONSTRAINT [DF_dataSale_SaleQnty] DEFAULT ( 0 ),
	CONSTRAINT [PK_dataSale] PRIMARY KEY  NONCLUSTERED 
	(
		[SaleID]
	)  ON [PRIMARY] 
) ON [PRIMARY]
GO
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / "Нормализация" данных / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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