Почему я не могу сравнить 2 таблицы с разным количеством кортежей в реляционном? - PullRequest
0 голосов
/ 26 февраля 2020

В классе возник вопрос, и я не уверен, что понимаю ответ. В реляционной программе https://ltworf.github.io/relational/ при использовании оператора M вы ДОЛЖНЫ иметь таблицы с одинаковым числом кортежей (мой учитель сказал, что сравнивать яблоки с яблоками, а не яблоки с апельсинами). Однако, если я запускаю запрос только по одному столбцу в 2 таблицах (например, город в базе данных пользователей и город в базе данных storeLocation), почему требуется, чтобы таблицы имели одинаковое количество кортежей?

Если я хочу сравнить город в 2 таблицах, почему в каждой таблице должны быть одинаковые кортежи? Почему я не могу просто запросить информацию о городе, не беспокоясь о количестве кортежей в таблице.

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Чтобы вы могли использовать обычные операторы множеств (- ∪ ∩) для отношений, они должны быть одного и того же «вида» отношения. То есть они должны иметь одинаковые столбцы.

Для этого вам необходимо использовать проекцию и переименование.

Так что если у вас есть отношение A с полями id, name и Вы хотите сделать объединение с отношением B, которое имеет id, first_name, last_name, что вам нужно сделать: A ∪ πid, name (ρ first_name ➡name (B))

1 голос
/ 27 февраля 2020

Википедия об операторе пересечения Кодда - т. Е. Ваше

Для объединения множеств и разности наборов, два задействованных отношения должны быть union- совместимый - то есть два отношения должны иметь одинаковый набор атрибутов. Поскольку пересечение множеств определяется в терминах объединения множеств и разности множеств, два отношения, участвующих в пересечении множеств, также должны быть совместимы с объединением.

Ничего о количестве кортежей в аргументах.

Кстати, «реляционный», на который вы ссылаетесь, кажется очень плохим. На странице «Объяснение [sic] всех операторов и их синтаксиса» нет объяснения ни семантики, ни синтаксиса операторов. Я ожидал бы, что это объяснит о требовании, чтобы атрибуты были одинаковыми. У него есть только один пример, использующий , «Это некоторые допустимые запросы». и это очень сложно и неверно во многих отношениях:

ρ id➡i,name➡n(A) - π a,b(π a,b(A)) ∩ σage > 25 or rank = weight(A)
  • σage > 25 or rank = weight(A) неверно: для сравнения должно быть двойное ==, как в первом примере.
  • Кажется, что между двоичными операторами нет системы приоритетов, поэтому - связывается более жестко, чем ?
  • В любом случае, аргументы для - и несовместимы с объединением: проекция π a,b(A) имеет только атрибуты a,b, тогда как выделение σ имеет все атрибуты A (включая age, rank), а проекция ρ имеет все атрибуты, кроме переименованных на i, n.

Неудивительно, что вы запутались. Кто тебе сказал использовать программу реляционную? Я бы выбросил это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...