Pergunta

Eu estou atualmente trabalhando através de uma tupla de cálculo pergunta e eu corri em uma situação onde eu tenho duas respostas que parecem corretas para mim, e eu não tenho certeza se a minha lógica é errado, ou se ambos são respostas correctas (e se assim for, é mais correto que o outro).

Eu estou tentando encontrar o sid da loja, que fornece a cada item.Os esquemas são:

Stores(sid: integer, sname: string)

Items(iid: integer, iname: string)

Supplies(sid: integer, iid: integer, price: integer)

O que me ocorreu foi:

{ P | ∃ S1 ∈ Supplies(P.sid = S1.sid ∧ ∀ i ∈ Items(∃ S2 ∈ Supplies (S2.iid = i.iid ∧ S2.sid = S1.sid)))}

{ P | ∃ S1 ∈ Supplies(P.sid = S1.sid ∧ ∀ i ∈ Items(S1.iid = i.iid))}

Meu raciocínio é que eu estou olhando para o sid, onde para todos os Itens há uma entrada de Suprimentos tabela que corresponde à iid.A única diferença real entre as minhas respostas é que a segunda não usar uma segunda separado Suprimentos tabela que nos permite cortar o adicional S2.sid = S1.sid.O meu texto tem uma pergunta semelhante a este e tem uma resposta semelhante a 1, mas o meu raciocínio me leva a segunda resposta.

Foi útil?

Solução

Responder

Eu vou mudar o nome de suas tabelas um pouco:

Store(s) -- store [s.sid] has name [s.sname]
Item(i) -- item [i.iid] has name [i.iname]
Offer(o) -- store [o.sid] offers item [o.iid] for $[o.price]

Você deseja que a tupla(s) do (s) formulário < sid > onde

-- store s.sid offers every item, ie
-- for all Items i: store s.sid offers item i.iid, ie
-- for all Items i: there exists Offer o: [o.sid = s.sid ∧ o.iid = i.iid], ie
∀ i ∈ Items ∃ o ∈ Offer [o.sid = s.sid ∧ o.iid = i.iid]

A consulta de tais lojas-e pode haver mais do que uma loja-é:

{ s : < sid > | ∀ i ∈ Items ∃ o ∈ Offer [o.sid = s.sid ∧ o.iid = i.iid] }

Sua resposta 2

Eu estou olhando para o sid, onde para todos os Itens há uma entrada de Suprimentos tabela que corresponde à iid.

Que tem um ""para todos os que não-existe", assim como a minha solução.Mas sua proposta de resposta 2 tem um "não-existe, por que e para todos":

{ P | ∃ S1 ∈ Supplies(
        P.sid = S1.sid
    ∧ ∀ i ∈ Items(S1.iid = i.iid)
    )}

Que pede para tuplas P onde há uma oferta S1, onde [P sid é S1 sid e para todos os Itens S1 s iid é que o item iid].Eu espero que você pode ver que esta envolve um único iid sendo o mesmo que todos os queridos no Item, não o que você deseja.

Sua resposta 1

{ P | ∃ o ∈ Offer (
        P.sid = o.sid
    ∧ ∀ i ∈ Item (∃ o2 ∈ Offer (o2.iid = i.iid ∧ o2.sid = o.sid))
    )}

Observe acima que a ∀ ... significa store o.sid offers every item.Assim:

{ P | ∃ o ∈ Offer (P.sid = o.sid
    ∧ store o.sid offers every item  )
    )}

Se não há ofertas e algumas lojas, depois, em cada loja oferece a cada item.Mas como não existem ofertas, é falso que ∃ o ∈ Offer (P.sid = o.sid)).Não Ps fazer o que é verdade.Portanto, este é {}.Portanto, esta não é a resposta.

(A sua resposta 1 pode ser modificado a partir de um livro de texto de resposta expressa por Codd original relacionais operador de divisão.Mas então, dividindo Oferece por Itens, na verdade, não retornam tuplas s onde store s.sid offers every item.Ele retorna linhas onde store s.sid offers every item AND there is at least one item.Então, a resposta é não expressa por Ofertas/Itens.)

(Na verdade 2 tem um extra ∃ em comparação com a sua natural linguagem de descrição e a minha resposta, mas é a exterior ∃.Assim, a solução 1 é dessa forma que lembra a resposta correta.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a dba.stackexchange
scroll top