Реляционная алгебра для банковского сценария
У меня есть ситуация, когда я нигде. Я не знаю, как решить вопросы реляционной алгебры.
Deposit (Branch, Acc-No, Cust-Name, Balance)
Loan (Branch, Loan-No, Cust-Name, Balance)
Branch (Branch, Assets, Branch-County)
Customer (Cust-Name, Cust-County, Branch)
Создайте отношение, в котором отображаются филиал, имя клиента, баланс и номер счета для всех клиентов, имеющих кредит более 2500 фунтов стерлингов, и всех клиентов, имеющих депозитный счет с балансом менее 100 фунтов стерлингов. Все клиенты должны быть в филиале Romford.
Это то, что я придумал до сих пор. Это правильно?
π Branch, Acc-No, Cust-Name, Balance (
σ(Loan.Balance > 2000 ∧ branch='Romford')(Loan)
∪ σ(Deposit.Balance < 150 ∧ branch='Romford')(Customer ∩ Deposit)
)
Правильные Ansers это:
π Branch, Cust-Name, Balance, Acc-No,
(σ Balance < 100^branch=”Romford” (Deposit))
∪
π Branch, Cust-Name, Balance, Loan-No,
(σ Balance > 2500 ^branch=”Romford”(Loan))
2 ответа
Даны заявления. Каждая таблица / отношение имеет оператор, параметризованный столбцами / атрибутами. (Его "характерный предикат".) Строки / кортежи, которые делают утверждение истинным, идут в таблицу / отношение. Сначала найдите утверждения для данных таблиц / отношений:
// customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
Deposit (Branch, Acc-No, Cust-Name, Balance)
// customer [Cust-Name] loan [Loan-No] balance is £[Balance] at branch [Branch]
Loan(Branch, Loan-No, Cust-Name, Balance)
. . .
Обратите внимание, что определение таблицы / отношения является сокращением для оператора.
Запрос заявления. Теперь соедините эти данные операторы, чтобы получить утверждение, которое удовлетворяют только те строки, которые мы хотим. Используйте И, ИЛИ, И НЕ, И условие. Сохранить или отбросить имена. Используйте новое имя, если оно вам нужно.
Я сделаю пример как часть вашего задания:
-- informal style version
branch, customer name, account balance and account number for
customers that have a loan bigger than £2000
at Romford branch
Я хочу эти строки. Поэтому я хочу сказать, что именно эти строки соответствуют действительности. Поэтому я делаю заявления, которые становятся все ближе и ближе к тому, который я хочу. Итак, я начинаю:
-- columns/attributes Cust-Name, Loan-No, Balance, Branch
customer [Cust-Name] loan [Loan-No] balance is £[Balance] at branch [Branch]
Теперь я хочу использовать другое имя для остатков по ссуде, потому что я хочу использовать остаток только для остатков на счетах:
-- columns/attributes Cust-Name, Loan-No, Loan-Balance, Branch
customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch]
Теперь я тоже хочу остатки на счетах:
-- columns/attributes Cust-Name, Loan-No, Loan-Balance, Branch, Balance, Acc-No
customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch]
AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
Если бы я использовал только одно имя Баланс, то это должен был быть баланс ссуды и баланс счета. Строки / кортежи были бы для клиентов с остатком ссуды, равным остатку на счете. И столбец / атрибут Баланс был бы этими значениями.
Теперь я хочу ограничить остатки и филиал:
-- columns/attributes Cust-Name, Loan-No, Loan-Balance, Branch, Balance, Acc-No
customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch]
AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
AND [Loan-Balance]>2000 AND [Branch]='Romford'
Теперь я хочу только некоторые из столбцов / атрибутов:
-- statement style version
-- columns/attributes Cust-Name, Branch, Balance, Acc-No
Keeping Branch, Cust-Name, Balance, Acc-No: (
customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch]
AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
AND [Loan-Balance]>2000 AND [Branch]='Romford')
Это утверждение для строк примера.
Вы можете использовать "Сохранение имен для сохранения " или "Удаление имен для удаления". (В логике "Удаление" называется FOR SOME или THERE EXISTS. Потому что мы хотим, чтобы оператор внутри него был истинным значением FOR SOME для имени, т.е. мы хотим, чтобы ЕСТЬ существовало значение (я) для имени, которое делает утверждение истинным.)
Запрос стенограммы. Теперь замените каждое утверждение его сокращением.
В моем примере я получаю:
-- shorthand style version
-- columns/attributes Cust-Name, Branch, Balance, Acc-No
Keeping Branch, Cust-Name, Balance, Acc-No: (
Loan (Branch, Loan-No, Cust-Name, Loan-Balance)
AND Deposit (Branch, Acc-No, Cust-Name, Balance)
AND Loan-Balance>2000 AND Branch='Romford')
(Обратите внимание, что во второй половине попытки вашего вопроса вам не нужен Customer. Потому что вам не нужно его утверждение. Потому что вы можете указать все о строках, которые хотите без него. Так что это просто добавляет Cust-County, который вы в конечном итоге выбрасывать без использования.)
Запрос алгебры Теперь, чтобы получить алгебру, замените:
- каждое утверждение по его таблице / отношению
- каждый оператор AND таблицы / отношения с помощью ⋈ (естественное соединение)
- каждое ИЛИ операторов таблицы / отношения (которые должны иметь одинаковые столбцы / атрибуты) с помощью ∪ (объединение)
- каждый оператор AND, а не операторы (которые должны иметь одинаковые столбцы / атрибуты) на \ (разница)
- каждое условие И условием σ
- каждые Сохранение имен для сохранения с помощью π имен (проекция) (и Сбрасывание на π имен для сохранения)
- каждый столбец / атрибут переименовывается в данном утверждении с помощью ρ (переименование).
∩ (пересечение) и x (произведение) являются особыми случаями ⋈ (∩ для обеих сторон одинаковые столбцы / атрибуты и x для отсутствия общих столбцов / атрибутов).
Помните, что имена столбцов / атрибутов вводятся с помощью операторов таблиц / отношений и таблиц / отношений, но удаляются с помощью Keeping / Dropping & π. Помните, что переименование в данном утверждении становится ρ.
Я получил:
-- algebra style version
π Branch, Cust-Name, Balance, Acc-No
σ Branch='Romford' σ Loan-Balance>2000
((ρ Loan-Balance/Balance Loan) ⋈ Deposit)
(Я не знаю, какую конкретную запись алгебры вы должны использовать. Изучите ее правила для расстановки имен и использования equijoin против естественного соединения. Также я не знаю, какие σ-условия это позволяет.)
Следуй примеру. Поэтому возьмите описание строк и напишите утверждение, что именно эти строки соответствуют действительности. Затем перейдите к заданным утверждениям. Затем замените на короткие. Затем заменить на алгебру.
- Каковы ваши данные заявления?
- Каковы их короткие?
- Каковы их имена таблиц / отношений?
- Каковы их столбцы / атрибуты?
- Какие столбцы / атрибуты строк / кортежей вы хотите?
- Что такое ясное, простое утверждение на естественном языке о том, что строки, которые вы хотите, делают истинными, а строки, которые вы не хотите, - нет? Но избегайте местоимений, потому что они не переводятся в алгебру; просто используйте имена столбцов / атрибутов. А если вам нужно новое имя, просто придумайте его и сделайте заявление об этом.
- Какое одно данное утверждение является частью вашего общего заявления?
- Что такое сокращенная версия?
- Что такое версия алгебры?
- Вы изменили имя в данном утверждении? Затем переименуйте его в его таблицу / отношение через ρ.
Продолжите для другой части вашего общего заявления.
- Хотите комбинацию данных утверждений? Затем используйте AND, OR, AND NOT и Keeping / Dropping.
- Вы не хотите знать значение столбца / атрибута, который вы упомянули? Затем используйте Keeping / drop (затем π).
- Вы упомянули слишком много имен? Затем сохраните те, которые вы хотите через π (и соответствующие Keeping / Dropping).
Продолжайте идти.
Вам нужно будет найти правильный порядок, чтобы говорить вещи. Попробуйте разные заказы. Потому что вы должны использовать НЕ через И НЕ из операторов / таблиц или через условие. И И и И НЕ операторы / таблицы должны иметь одинаковые столбцы / атрибуты на каждой стороне. И имя in в условии должно быть упомянуто в утверждении, с которым оно ANDed.
Ваш вопрос. Мне потребовалось некоторое время, чтобы разобрать и исправить цель, которую вы дали:
Укажите филиал, имя клиента, баланс и номер счета для всех клиентов, имеющих кредит более 2000 фунтов стерлингов, а также для всех клиентов с депозитным счетом с балансом менее 150 фунтов стерлингов. Все эти клиенты должны быть в филиале Romford.
Это:
- Укажите филиал, имя клиента, остаток на счете и номер счета ( для всех клиентов, имеющих кредит на сумму более 2000 фунтов стерлингов, и всех клиентов с депозитным счетом на счете менее 150 фунтов стерлингов ). Все эти клиенты должны быть в Ромфорд Бранч.
(Мне пришлось добавить слово, чтобы понять это. Но невероятно, что это должно означать "филиал, имя клиента, баланс и номер [помечены что??], где баланс и номер - это баланс ссуды и номер для клиентов с ссуды> 2000 или баланс и номер - это баланс счета и номер для клиентов с балансом счета < 150".)
Это имеет AND в середине, так что вы можете подумать, что оно даст алгебру ⋈ (естественное соединение) или ∩ (пересечение). Но вы должны описывать свои столбцы / атрибуты только в терминах данных утверждений и условий. Оказывается, что И превращается в ИЛИ. Также оказывается, что мы должны добавить дополнительную выписку по депозиту. Так что у нас есть информация об учетной записи клиентов кредита. Помните, что вы должны иметь одинаковые столбцы / атрибуты по обе стороны от ИЛИ (или И НЕ).
Первый "филиал, имя клиента, остаток на счете, номер счета" для "всех клиентов, имеющих кредит на сумму более £2000". Это похоже на то, что мы сделали выше. Но на этот раз давайте ограничим ветви позже:
-- statement A
-- columns/attributes Cust-Name, Branch, Balance, Acc-No
Keeping Branch, Cust-Name, Balance, Acc-No: (
customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch]
AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
AND [Loan-Balance]>2000)
Теперь "филиал, имя клиента, остаток на счете, номер счета" для "всех клиентов с депозитным счетом с остатком менее £150". Это проще, чем раньше, поэтому я надеюсь, что вы можете понять это напрямую:
-- statement B
-- columns/attributes Cust-Name, Branch, Balance, Acc-No
customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
AND [Balance]<150
Теперь мы хотим, чтобы строки, которые делают оператор "оператор А оператор И Б" истинным:
-- columns/attributes Cust-Name, Branch, Balance, Acc-No
Keeping Branch, Cust-Name, Balance, Acc-No: (
customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch]
AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
AND [Loan-Balance]>2000)
OR customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
AND [Balance]<150
Теперь мы ограничиваем ветку:
-- statement for goal
-- columns/attributes Cust-Name, Branch, Balance, Acc-No
( Keeping Branch, Cust-Name, Balance, Acc-No: (
customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch]
AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
AND [Loan-Balance]>2000)
OR customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch]
AND [Balance]<150
)
AND [Branch]='Romford'
Это утверждение для искомых строк. Теперь мы заменяем сокращениями:
-- shorthand for goal
-- columns/attributes Cust-Name, Branch, Balance, Acc-No
( Keeping Branch, Cust-Name, Balance, Acc-No: (
Loan (Branch, Loan-No, Cust-Name, Loan-Balance)
AND Deposit (Branch, Acc-No, Cust-Name, Balance)
AND [Loan-Balance]>2000)
OR Deposit (Branch, Acc-No, Cust-Name, Balance)
AND [Balance]<150
)
AND [Branch]='Romford'
Ответ. Теперь мы заменим на алгебру:
-- algebra style version
σ Branch='Romford'
( π Branch, Cust-Name, Balance, Acc-No
σ Loan-Balance>2000
((ρ Loan-Balance/Balance Loan) ⋈ Deposit)
∪ σ Balance<150 Deposit))
PS: алгебра = вычисления без петель Весь смысл реляционной алгебры состоит в том, что операторы точно соответствуют алгебраическим выражениям: операторы соответствуют таблицам / отношениям, а логические операторы (операторов) соответствуют операторам алгебры. Но версия алгебры - это описание без петель, которое может быть автоматически вычислено. Строки, которые делают утверждение истинным, являются значением его алгебраической версии. Мы даем строки для операторов таблицы / отношения, и алгебра вычисляет строки для любого другого оператора, который мы комбинируем из них.
Вот ответ, который я придумал:
π Branch, Cust-Name, Balance, Acc-No, (σ Balance < 100^branch=”Romford” (Deposit))
∪
π Branch, Cust-Name, Balance, Loan-No, (σ Balance > 2500 ^branch=”Romford”(Loan))