Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Физическая модель хранилища данных: учет влияния транзакций, денормализация таблиц
Горизонтальное разбиение таблиц
На практике горизонтальное разбиение (horizontally partition) применяется для изоляции одной группы строк таблицы от другой, когда использование этих групп строк в транзакциях почти не пересекается. Типичный пример — изоляция текущих данных от архивных данных.
Рассмотрим систему обработки заказов. Менеджеры и продавцы работают с текущими заказами. Обработка выполненных заказов (архивные данные) выполняется при подготовке разного рода отчетов (в частности, путем создания киоска данных). Даже если готовится ежедневный отчет с обращением к архивным данным, то в организациях среднего размера частота использования текущих данных все равно превышает частоту использования архивных данных на 2-3 порядка, а отношение объема текущих данных к архивным данным может составлять менее 0.001.
Одним из практических критериев в данном случае может служить классическое правило 80-20. Если активно работают с 20-ю процентами данных, то вероятнее всего, остальные 80% можно перенести в архивную таблицу.
Пример 19.6.
Таблицей – кандидатом на горизонтальное разбиение является таблица "Проект" (PROJECT), структура которой показана на рис. 19.8. В этой таблице хранятся архивные данные – выполненные проекты.
Предположим, что число выполненных проектов в год в организации где-то около 1000. Данные в таблицы нужно хранить 10 лет (10000 записей). Средняя продолжительность проекта равна двум месяцам, т. е. число незавершенных проектов в данный момент времени не превышает 200. Через 5 лет отношение числа текущих проектов к архивным проектам достигнет 0.04.
Следовательно, можно рассмотреть вопрос о горизонтальном разбиении этой таблицы и выполнить его, как показано на рис. 19.9.
Рис. 19.9. Горизонтальное разбиение таблицы "Проект" (PROJECT) на две таблицы: "Текущие проекты" (PROJECT_CUR) и "Архивные проекты" (PROJECT_OLD)
Мы разбили таблицу "Проект" (PROJECT) горизонтально на две таблицы — "Текущие проекты" (PROJECT_CUR) и "Архивные проекты" (PROJECT_OLD). Последовательность команд для создания таблиц разбиения приведена ниже.
create table PROJECT_CUR ( PROJNO char(8) not null, PROJ_NAME char(40) not null, BUDGET decimal(9,2) not null, constraint PK_PROJECT_CUR primary key (PROJNO) ) go create table PROJECT_OLD ( PROJNO char(8) not null, PROJ_NAME char(40) not null, BUDGET decimal(9,2) not null, constraint PK_PROJECT_OLD primary key (PROJNO) ) go
Для совместного использования двух этих таблиц можно предусмотреть представление "Все проекты" ( ALL_PROJECT ), которое показано на рис. 19.10.
Команда SQL для создания представления "Все проекты" ( ALL_PROJECT ) приведена ниже.
CREATE VIEW ALL_PROJECT AS SELECT PROJNO, PROJ_NAME, BUDGET FROM PROJECT_CUR UNION SELECT PROJNO, PROJ_NAME, BUDGET FROM PROJECT_OLD;
Заметим, что далее по тексту под исходной таблицей понимается и сама таблица, и то, во что она превратилась после разбиения.