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

Аспект интерпретации


В [1] я умышленно не разъяснял в деталях, какая интерпретация таблиц S и P имеется в виду. Если бы я это проделал достаточно тщательным образом, то бессмысленность null’ов стала бы абсолютно очевидной (и, помимо прочего, не было бы вообще никакого смысла обсуждать запрос, приведенный в примере). Но беда в том, что доводы, основанные на интерпретации, являются немного заумными, и некоторым читателям могло бы быть несколько трудно их понять; поэтому, правильно это или нет, я приводил доводы, которые, по моему мнению, было проще понять («более доступные» по выражению Рубинсона). Однако теперь позвольте мне привести доводы на основе интерпретации.

Прежде всего, на тот случай, если найдутся читатели, незнакомые с терминологией, позвольте мне объяснить, что:

  1. Считается, что каждой таблице t соответствует некоторый предикат pred.
  2. Если у таблицы имеется n столбцов, то у предиката pred – n параметров.
  3. Каждая строка r таблицы t содержит значения в n столбцах. Считается, что каждая такая строка соответствует некоторому высказыванию prop: а именно, высказыванию, получаемому путем использования значений n столбцов для замены n параметров в pred (каждое такое высказывание является инстанциацией предиката pred).
  4. Про каждое высказывание, полученное таким образом, т.е. про каждую инстанциацию предиката pred, мы полагаем или знаем, что оно истинно.

Как кажется, в [3] Рубинсон утверждает, что имеется логическое различие между тем, что (a) что-то является истинным, и (b) мы полагаем что-то истинным, и именно этот различие является основой трудностей в 3VL. Однако, на самом деле, мы должны обращать внимание на это различие даже при отсутствии null’ов и 3VL, хотя на практике, конечно, это часто не делается. Поэтому я полагаю, что здесь этот довод Рубинсона только уводит в сторону от сути вопроса. Более того, как я показываю в [2], даже в базе данных без null’ов и 3VL мы может получать ответы типа «не знаю». Но, возможно, здесь и это не существенно. Позвольте мне вернуться к сути проблемы.


Рассмотрим таблицу P. У этой таблицы два столбца – PNO и CITY, и поэтому у представляющего ее предиката должно быть два параметра. Что это за предикат? Очевидным кандидатом является следующий: деталь PNO хранится в городе CITY. Но нам следует быть более точными. На самом деле, в соответствии с приведенными выше замечаниями, более осмысленным кандидатом является такой предикат: мы знаем, что деталь PNO хранится в городе CITY.

Но допустим теперь, что мы не знаем, где хранится деталь P1. Тогда истинное высказывание вида «мы знаем, что деталь P1 хранится в городе CITY» просто не существует. Просто неверно то, что для какого-то конкретного значения CITY, каким бы оно не было, мы знаем, что деталь P1 хранится в городе CITY. (Замечание: по-видимому, мы знаем, что эта деталь где-то хранится, поскольку все детали где-то хранятся, но высказывание «мы знаем, что деталь P1 где-то хранится» является совершенно другим высказыванием.

Поскольку никакого истинного высказывания в требуемой форме не существует, не существует и соответствующая строка. И поэтому строка для детали P1 не может присутствовать в данной таблице.

Теперь допустим на мгновение, что строка для детали P1 все-таки присутствует в таблице (с null’ом в столбце CITY). Тогда должен иметься и соответствующий предикат. Вероятно, он должен быть следующим:

Должно быть истинным либо то, что (a) мы знаем, что деталь PNO хранится в городе CITY, либо то, что (b) мы не знаем города для детали PNO.

(Замечу, что OR, связывающее части (a) и (b), здесь должно быть исключающим, а не включающим. Мы не можем допустить, чтобы для одной и той же детали город был и известен, и не известен.)

Однако теперь обратим внимание на то, что у части (a) этого предиката имеются два параметра (PNO и CITY), а у части (b) – только один параметр (PNO). Следовательно, строки, представляющие истинную инстанциацию части (a), имеют два столбца, а строки, представляющие истинную инстанциацию части (b), – только один столбец. И эти два вида строк с логической точки зрения не могут присутствовать в одной и той же таблице.Таким образом, говорить о том, что некоторая строка r в некоторой таблице t «содержит null», бессмысленно, или, по крайней мере, логически противоречиво (на самом деле, последняя формулировка лучше).

Возможно, мне следует добавить, что в схеме базы данных, которая точно соответствует ситуации и не вынуждает использовать null’ы, следовало бы иметь две отдельные таблицы: (a) таблицу P со столбцами PNO и CITY и предикатом «мы знаем, что деталь PNO хранится в городе CITY» и (b) таблицу P' с единственным столбцом PNO и предикатом «мы не знаем города для детали PNO».


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