Классика баз данных - статьи

       

Исходный пример


База данных, которую я использовал в качестве основы своих примеров в [1], выглядела следующим образом (S = suppliers (поставщики), P = parts (детали)):

В этой базе для детали P1 «CITY есть null». Более того (как я говорил в [1]):

Заметим для точности, что пустое место на рисунке там, где должно было бы находиться значение CITY для детали P1, означает отсутствие чего бы то ни было; в этой позиции нет вообще ничего, ни строки пробелов, ни пустой строки (а это значит, что «кортеж» детали P1 на самом деле кортежем не является, и я вернусь к этому вопросу позже).

Затем я задаю запрос «получить пары SNO-PNO, для которых города поставщика и детали различны или городом детали не является Париж», и предлагаю следующую «очевидную формулировку этого запроса на языке SQL»:

SELECT S.SNO, P.PNO FROM S, P WHERE S.CITY <> P.CITY OR P.CITY <> ’Paris’

Затем я показываю, что для показанной на рисунке базы данных результат этого SQL-выражения отличается от результата, которого мог бы ожидать пользователь от исходной формулировки запроса (на естественном языке).

Рубинсон говорит:

Проблема (примера Дейта) состоит не в том, что результат SQL не согласуется с реальностью, а в том, что Дейт плохо сформулировал свой исходный запрос… Формулировка на SQL в действительности не соответствует запросу [на естественном языке]; на самом деле, исходный запрос Дейта не может быть должным образом оттранслирован на SQL.

Но об этом я и говорил! Я согласен, что «сформулированный оператор SQL» не соответствует должным образом запросу на естественном языке; конечно, не соответствует, поскольку производит другой результат. В частности, с позволения Рубинсона, я совершенно точно не утверждал, что это положение дел «свидетельствует об ошибке в логике SQL». Логика SQL как таковая безошибочна (по крайней мере, допустим это в нашем обсуждении). Скорее, я утверждал, что «логика SQL отличается от логики, обычно используемой нами» в реальном мире. И это все.

В любом случае (и независимо от того, согласен ли Рубинсон со мной по этому поводу, или мы просто соглашаемся о различии наших точек зрения) я не думаю, что стоит тратить много времени на этот конкретный пример и на другие, ему подобные. Реальный вопрос состоит в том, как мы собираемся интерпретировать таблицы базы данных? И это приводит меня к следующему пункту.



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