Для того чтобы отразить факты



Таблица 3
A (Преподаватель) B (Предмет) Q (Количество часов)

Пушников Алгебра 40
Пушников Базы данных 80
Цыганов Геометрия 50
Шарипов Алгебра 40
Шарипов Геометрия 50

Таблица 3 Отношение "Читает лекции по…" Для того чтобы отразить факты 4-6 (характеризующие посещение студентами лекций), введем отношение Таблица 3. Упорядоченная тройка Таблица 3 посещает лекции по предмету Таблица 3. Назовем это отношение "Посещать лекции". Его также представим в виде таблицы:

Таблица 3

NOT F T U
T
F
U

Таблица 3 Таблица истинности NOTИмеется несколько парадоксальных следствий применения трехзначной логики. Парадокс 1. Null-значение не равно самому себе. Действительно, выражение null = null дает значение не ИСТИНА, а НЕИЗВЕСТНО. Значит выражение Парадокс 2. Неверно также, что null-значение не равно самому себе! Действительно, выражение nullТаблица 3 тоже не обязательно ЛОЖЬ! Парадокс 3. Таких парадоксов можно построить сколько угодно. Конечно, это на самом деле не парадоксы, а просто следствия из аксиом трехзначной логики.





Таблица 3
Табельный номер Фамилия Зарплата
1 Иванов 1000
2 Петров 2000
3 Сидоров 3000
2 Пушников 2500
4 Сидоров 3000

Таблица 3 Отношение A UNION BЗамечание. Как видно из приведенного примера, потенциальные ключи, которые были в отношениях Таблица 3 не наследуются объединением этих отношений. Поэтому, в объединении отношений Таблица 3 атрибут "Табельный номер" может содержать дубликаты значений. Если бы это было не так, и ключи наследовались бы, то это противоречило бы понятию объединения как "объединение множеств". Конечно, объединение отношений Таблица 3 имеет, как и любое отношение, потенциальный ключ, например, состоящий из всех атрибутов.





Таблица 3
PNUM DNUM VOLUME
3 1 1000
2 1 150
1 1 100
2 2 250
1 2 200
1 3 300
Замечание. Если явно не указаны ключевые слова ASC или DESC, то по умолчанию принимается упорядочение по возрастанию (ASC).



Таблица 3
Н_ПРО ПРОЕКТ
1 Космос
2 Климат

Таблица 3 Отношение ПРОЕКТЫ Отношение ЗАДАНИЯ (Н_СОТР, Н_ПРО, Н_ЗАДАН): Функциональные зависимости: {Н_СОТР, Н_ПРО} Н_ЗАДАН



Таблица 3

Номер поставщика
PNUMНомер детали
DNUMПоставляемое количество
VOLUME
1 1 100
1 2 200
1 3 300
2 1 150
2 2 250
3 1 1000

Таблица 3 Отношение "Поставки-2"



Таблица 3

Базовый ли атрибут
Наиме-нование атрибута Описание атрибутаФормула для вычислимого атрибута
Name Наименование товара Да
N Количество Да  
P1 Учетная цена товара Да  
S1 Учетная сумма на все количество   S1 = N*P1
PerSent Процент наценки на единицу товара Да  
P2 Наценка на единицу товара   P2 = P1*PerSent/100
S2Сумму наценки на все количество   S2 = N*P2
P3 Цену товара с учетом наценки   P3 = P1+P2
S3 Сумму на все количество с учетом наценки   S3 = N*P3
NDS Процент НДС Да  
P4 Сумма НДС на единицу товара   P4 = P2*NDS/100
S4 Сумма НДС на все количество   S4 = N*P4
P5 Цена товара с НДС   P5 = P3+P4
S5Сумма на все количество с НДС   S5 = N*P5

Таблица 3 Атрибуты товара Базовыми, т.е. требующими ввода данных являются всего 5 атрибутов (выделены серым цветом). Все остальные атрибуты вычисляются по базовым. Нужно ли хранить в отношении только базовые атрибуты, или желательно хранить все атрибуты, пересчитывая значения вычислимых атрибутов каждый раз при изменении базовых? Решение 1. Пусть в отношении решено хранить только базовые атрибуты. Достоинства решения:

Недостатки решения:Решение 2. Предположим, что в отношении решено хранить все атрибуты, в том числе и вычислимые. Достоинства решения:Недостатки решения:Как видим, оба решения имеют свои достоинства и недостатки. Важно то, что программный код, содержащий эти формулы, не исчезает ни в каком из этих решений (да и куда он денется, раз такова предметная область!). Только в одном случае код хранится в одном месте, а в другом может быть "размазан" по всему приложению. На самом деле данный пример сильно упрощен, т.к. еще одной неприятной особенностью наших бухгалтерий является то, что все расчеты должны вестись с определенной точностью, а именно - до копеек. Возникает проблема округления, а это еще более усложняет формулы для расчетов цен. Простой пример - вычисление НДС содержит операцию деления, следовательно может приводить к бесконечным дробям типа 15,519999… Такую дробь необходимо округлить до 15.52. Если продается одна единица товара, то это не страшно, но если продается несколько единиц товара, то сумму НДС на все количество можно считать по разным формулам:
  1. S4 = N* ROUND(P2*NDS/100) - СНАЧАЛА округлить при вычислении НДС на единицу товара, а ПОТОМ умножить на все количество, или
  2. S4 = ROUND(N*P2*NDS/100) - СНАЧАЛА умножить на все количество, а ПОТОМ округлить до требуемого знака.
Лирическое отступление. Автор, как математик по образованию (к.ф.-м.н.), считает, что верной, безусловно, является первая формула. Действительно, вычисляя по первой формуле, мы получим одну и ту же сумму НДС независимо от того, продали мы одну партию товара, содержащую 50 единиц, или продали 50 партий по одной единице в каждой. При вычислениях по второй формуле сумма НДС в партии, состоящий из 50 единиц товара отличается от суммы НДС по 50 партиям по одной единице товара в каждой. Разработав несколько складских программ, автор получал разные ответы на этот вопрос в разных бухгалтерия, разные ответы на этот вопрос в одной бухгалтерии в разное время, и разные ответы на этот вопрос в разных налоговых инспекциях. В конечном итоге, автор пришел к грустному выводу, что для того, чтобы стать бухгалтером, его способностей и образования недостаточно. Другие решения. Можно попытаться использовать и другие решения, для облегчения разработки и сопровождения в данном случае. Например, можно хранить в базовом отношении только базовые атрибуты, а для работы бухгалтерии использовать заранее подготовленные представления (динамические отношения, задаваемые оператором SQL). Тогда логика расчетов будет храниться в одном SQL-операторе, определяющем это представление. Другим вариантом может быть сохранение формул в виде хранимых процедур и функций базы данных. Проверка ограничения. К моменту проверки ограничения кортежа должны быть проверены ограничения целостности атрибутов, входящих в этот кортеж. Ограничение кортежа является немедленно проверяемым ограничением. Действительно, ограничение кортежа не зависит ни от каких других объектов базы данных, кроме атрибутов, входящих в состав кортежа. Поэтому никакие изменения в других объектах не могут повлиять на истинность ограничения.



Таблица 3
Транзакция A Время Транзакция B Неповторяемое считывание
Чтение ---
--- Чтение
--- Запись
--- Фиксация транзакции
Повторное чтение ---
Фиксация транзакции ---
 
Транзакция A ничего не знает о существовании транзакции B, и, т.к. сама она не меняет значение в строке, то ожидает, что после повторного чтения значение будет тем же самым. Результат. Транзакция A работает с данными, которые, с точки зрения транзакции A, самопроизвольно изменяются.



Содержание раздела