Relational Division всегда был бардаком и, скорее всего, останется таким. Первоначально он был изобретен как средство для реляционных систем запросов, позволяющее формулировать/отвечать на такие вопросы, как, например, «каков список клиентов, которые подписались на ВСЕ возможные типы страховых полисов». То есть он был задуман как средство для формулирования запросов, которые включали некую универсальную количественную оценку в качестве предиката, определяющего набор результатов.
Продолжая развивать пример с моими клиентами/полисами, давайте предположим, что набор «ВСЕХ возможных типов страховых полисов» сам по себе является изменяющимся во времени, то есть со временем могут появиться новые типы полисов, в то время как другие могут быть прекращены. Далее предположим, что «ВСЕ возможные типы страховых полисов» в определенном запросе означают, в частности, «ВСЕ типы полисов, которые в настоящее время открыты для подписки клиентами» (то есть прекращенные типы полисов не являются частью этого набора «ВСЕХ "типы").
Предположим, что этот набор «ВСЕХ возможных типов политик» в определенный момент равен {TYPE1, TYPE3}. TYPE2 снят с производства. Давайте также предположим, что клиентская ES все еще имеет политику типа TYPE2, очевидно, начиная с того времени, когда она была прекращена. Таким образом, клиентская ES имеет политики типа {TYPE1, TYPE2, TYPE3}.
Теперь ответьте на вопрос, есть ли у этого клиента «ВСЕ типы полисов, которые в данный момент открыты для подписки». Ваш ответ должен быть твердым «да». Вы можете понять, к чему все идет: реляционное разделение сосредоточено на сравнении двух наборов. Один — «сравнение» (набор типов политик, на которые подписан клиент), другой — «эталон» (набор типов политик, которые в данный момент открыты для подписки).
Теперь есть по крайней мере два полезных сравнения, которые можно провести между множествами: одно для равенства, другое для вмещения множества (подмножества). В некоторых случаях запроса вам понадобится тест на равенство, а в других случаях вам понадобится тест на включение. А реляционный оператор под названием «деление» (в каком бы бессодержательном смысле он ни был) не позволяет провести это различие. Я так понимаю, что вы спрашиваете именно об этом явлении, и ответ заключается просто в том, что выбор сделан по замыслу, так сказать, и зашит в определение оператора. Это делает оператор "полезным" в тех случаях, когда его определение соответствует вашим потребностям, и бесполезным в других случаях.
Хорошая новость заключается в том, что когда вам нужно расшифровать SQL для реляционного деления, не будет большой разницы между делением-с-равенством и делением-с-включением (несмотря на тот факт, что оператор алгебры, по определению только один из двух, а другой просто даже не имеет алгебраического оператора). Основная проблема заключается в том, что само равенство множеств очень запутанно для выражения в SQL, и это не менее так «внутри запроса реляционного деления» ...
И тогда есть еще все действительные моменты, уже сделанные Филиппом. Прочтите их, но очень внимательно.
person
Erwin Smout
schedule
16.07.2014