Ищу расширенное объяснение оператора Divide

Я читаю о восьми оригинальных операторах Кодда в Inside Microsoft SQL Server 2008: T-SQL Querying by Itzik Ben- Gan, Lubor Kollar, Dejan Sarka и Steve Kass и не понимают оператора Divide.

Цитаты, определяющие оператор Divide:

«Отношение делителя используется для разделения отношения дивидендов и получения частного отношения. Частное отношение состоит из тех значений одного столбца из таблицы дивидендов, для которых второй столбец содержит все значения делителя».

Это утверждение согласуется с определением и примером из Википедии .

«Формула для оператора Divide включает три соотношения: a разделить на b на c, где a — это делимое, b — делитель, а c — отношение посредника. Пусть отношение a имеет атрибуты A, а отношение b — атрибуты B. Оператор Divide возвращает отношение, которое включает все кортежи из divisor, такие что кортеж {A, B} появляется в отношение посредника для всех кортежей из отношения делителя».

Диаграмма ниже используется для демонстрации этого утверждения. Я считаю, что отношения представлены в следующем порядке: делимое, делитель, посредник и конечный результат.

введите здесь описание изображения

Второе отношение (делитель) имеет {a, x}, {a, z}, {b, x} и {b, z} для кортежей. Мой мыслительный процесс следует за тем, что, поскольку есть кортежи {b, x} и {b, z}, b должен быть включен в конечный результат. Я проверил исправления книги на веб-сайте книги (ссылка в начале этого поста) и уверен, что ошибаюсь.

Почему результат примера диаграммы a, а не a и b?


person Jesslyn    schedule 16.07.2014    source источник


Ответы (2)


Relational Division всегда был бардаком и, скорее всего, останется таким. Первоначально он был изобретен как средство для реляционных систем запросов, позволяющее формулировать/отвечать на такие вопросы, как, например, «каков список клиентов, которые подписались на ВСЕ возможные типы страховых полисов». То есть он был задуман как средство для формулирования запросов, которые включали некую универсальную количественную оценку в качестве предиката, определяющего набор результатов.

Продолжая развивать пример с моими клиентами/полисами, давайте предположим, что набор «ВСЕХ возможных типов страховых полисов» сам по себе является изменяющимся во времени, то есть со временем могут появиться новые типы полисов, в то время как другие могут быть прекращены. Далее предположим, что «ВСЕ возможные типы страховых полисов» в определенном запросе означают, в частности, «ВСЕ типы полисов, которые в настоящее время открыты для подписки клиентами» (то есть прекращенные типы полисов не являются частью этого набора «ВСЕХ "типы").

Предположим, что этот набор «ВСЕХ возможных типов политик» в определенный момент равен {TYPE1, TYPE3}. TYPE2 снят с производства. Давайте также предположим, что клиентская ES все еще имеет политику типа TYPE2, очевидно, начиная с того времени, когда она была прекращена. Таким образом, клиентская ES имеет политики типа {TYPE1, TYPE2, TYPE3}.

Теперь ответьте на вопрос, есть ли у этого клиента «ВСЕ типы полисов, которые в данный момент открыты для подписки». Ваш ответ должен быть твердым «да». Вы можете понять, к чему все идет: реляционное разделение сосредоточено на сравнении двух наборов. Один — «сравнение» (набор типов политик, на которые подписан клиент), другой — «эталон» (набор типов политик, которые в данный момент открыты для подписки).

Теперь есть по крайней мере два полезных сравнения, которые можно провести между множествами: одно для равенства, другое для вмещения множества (подмножества). В некоторых случаях запроса вам понадобится тест на равенство, а в других случаях вам понадобится тест на включение. А реляционный оператор под названием «деление» (в каком бы бессодержательном смысле он ни был) не позволяет провести это различие. Я так понимаю, что вы спрашиваете именно об этом явлении, и ответ заключается просто в том, что выбор сделан по замыслу, так сказать, и зашит в определение оператора. Это делает оператор "полезным" в тех случаях, когда его определение соответствует вашим потребностям, и бесполезным в других случаях.

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

И тогда есть еще все действительные моменты, уже сделанные Филиппом. Прочтите их, но очень внимательно.

person Erwin Smout    schedule 16.07.2014

Результатом на диаграмме действительно должны быть строки {a} и {b}. Но книга и ваше послание перепутаны.

Существует несколько реляционных вариантов DIVIDE. Существует деление Кодда, сокращенная версия деления Кодда Дейта, деление Тодда, малое (подобное Кодду) деление Дейта и Дарвена и большое (подобное Тодду) деление и их обобщенные малые и большие делители, а также деление Дарвена на -разделить-на.

Цитаты и схема взяты из книги. Во-первых, они пытаются говорить о разделении Кодда, и оно имеет два входа; «отношение делителя используется для разделения отношения дивидендов». (В книге даже говорится: «Именно так изначально был определен оператор Divide».) Но второе предложение неверно. Во-первых, речь идет о столбцах, а не о непересекающихся наборах столбцов. Во-вторых, он ограничивает свой второй операнд только наличием подмножества столбцов первого операнда. (Это сокращенная версия разделения Кодда Дейта.) В-третьих, это непонятно. Пусть A, B и C — непересекающиеся наборы атрибутов, а AB и BC — отношения с наборами атрибутов A U B и B U C. Тогда AB DIVIDEBY BC Кодда возвращает подстроки A, которые появляются в AB, с каждой подстрокой B, которая появляется в BC.

Вики на самом деле описывает разделение Кодда. Так что только если вы игнорируете проблемы выше, первая цитата «согласна» с ней.

Затем вторая цитата говорит о другом "расширенном" операторе деления. В книге объясняется, что деление Кодда не отражает естественную формулировку, использующую «для всех» в обычных ситуациях. Затем они неясно представляют другого оператора. Они пытаются определить Малый дивизион. Вход «включает в себя три отношения: деление a на b на c». Показанная диаграмма даже помечена как «расширенное деление».

К сожалению, это определение не только неграмотно, но и непонятно. A DIVIDEBY B PER AB возвращает строки, которые появляются в A, которые появляются как подстроки в AB с каждой строкой, которая появляется в B. Они должны сказать, что он возвращает кортежи {A} в делимом, так что кортеж {A, B} появляется в медиатор со всеми кортежами {B} в ​​делителе

Эта книга - беспорядок. Надпись ужасна. Корректура ужасная. Учитывая текст в этом разделе, нет причин ожидать, что ответы будут правильными. Но и вы невнимательно читаете.

Тогда вы неправильно интерпретируете аргументы на диаграмме. Но вы этого не замечаете, потому что не следуете определению. Таким образом, не замечая, что определение непонятно. На диаграмме показаны отношения A-AB-B-результат, который представляет собой делимое-посредник-делитель-частное. Так что вы опять невнимательно читаете.

И это правда, что в результате должны быть обе строки {a} и {b}. Но я не могу сказать, что вы «правы» в этом, потому что ваш «мыслительный процесс», кажется, «создает смутное впечатление». Некоторая неопределенность, безусловно, связана с плохим написанием книги. Но вы, кажется, не замечаете, что книга непонятна. Читай внимательно!

person philipxy    schedule 16.07.2014
comment
Когда вы описываете книгу такими терминами, как «неясно», «грамотно», «неразборчиво», «беспорядок» и «ужасно», я думаю, что с вашей стороны было бы неразумно говорить, что я читаю невнимательно. Я согласен с тем, что я сильно запутался, пытаясь прочитать эту книгу, и поэтому мое понимание до сих пор не гарантируется правильным. - person Jesslyn; 16.07.2014
comment
Если книга действительно невнятная, то лучшим советом было бы просто бросить ее, а не читать внимательно!!! - person Erwin Smout; 16.07.2014
comment
@Jesslyn Я пытался написать самый полезный ответ, какой только мог. Я процитировал четкие утверждения, большинство из которых в самом вопросе, которые противоречат вопросу. (Но, возможно, я недостаточно ясно выразился.) - person philipxy; 17.07.2014
comment
@ErwinSmout Может быть, бросить книгу - хороший совет. Я обдумал это. Но это случай, а не скорее, чем. Цитаты и ссылки в сообщении противоречат очевидным вещам. - person philipxy; 17.07.2014