3. Трехуровневая архитектура ANSI/SPARC
Первая попытка создания стандартной терминологии и общей архитектуры СУБД была принята в 1971 г. группой DBTG. Она была создана после конференции CODASYL прошедшей в том же году. Группа DBTG признала необходимость использования 2х уровневого подхода. (схема-подсхема) При национальном институте стандартов США был создан комитет планирования стандартов и норм – ANSI/SPARC (ANSI – American National Standard Institute, SPARC – Standards Planning and Requirements Committee). И в 1975 г. этот комитет признал необходимость использования трехуровневого подхода к созданию системного каталога.
В соответствии с этим подходом используются три уровня абстракции описания элементов данных; они формируют трехуровневую архитектуру, охватывающую внешний, концептуальный и внутренний уровни.
Разделение приводит к тому, что каждый отвечает за свое и знает только свое; тем самым, достигается независимость от физического представления и от логического представления.
Внешний уровень – представление БД с точки зрения конечных пользователей. Этот уровень описывает ту часть БД, которая относится к каждому конечному пользователю. (из книги)
Концептуальный уровень – обобщающее представление БД. Описывает, какие данные хранятся в БД, а также связи, существующие между ними. (из книги)
Внутренний уровень – физическое представление БД в компьютере; описывает, как информация хранится в БД. (из книги)
Концептуальная схема является «сердцем» БД. Она поддерживает все внешние представления, а сама поддерживается средствами внутренней схемы. Именно концептуальная схема призвана быть полным и точным представлением требований к данным организации (предприятия).
Пример(различия между 3-мя уровнями представления данных):
• Представление 1: ФИО, дата рождения, сумма выплат за год;
• Представление 2: ФИО, дата приема на работу, подразделение
• Обобщенное представление: ФИО, дата рождения, дата приема на работу, подразделение, сумма выплат за год
• Внутреннее представление:
struct Employee {
int номер_сотрудника;
int номер_подразделения;
char фамилия [50], имя[50], отчество[50];
struct Date дата_рождения, дата_приема;
float сумма_выплат;
};