元組演算:不確定我的推理是否正確
我目前正在處理一個元組微積分問題,我遇到了一種情況,我有兩個對我來說似乎正確的答案,我不確定我的邏輯是否錯誤,或者它們是否都是正確的答案(如果是,還有一個比另一個正確)。
我正在嘗試找到供應每件商品的商店的 sid。模式是:
Stores(sid: integer, sname: string) Items(iid: integer, iname: string) Supplies(sid: integer, iid: integer, price: integer)
我想出的是:
{ 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))}
我的理由是,我正在尋找 sid,其中對於所有項目,Supplies 表中都有一個對應於 iid 的條目。我的答案之間唯一真正的區別是第二個不使用第二個單獨的 Supplies 表,它允許我們刪除額外的
S2.sid = S1.sid
. 我的教科書有一個與此類似的問題,並且答案類似於 1,但我的推理得到了第二個答案。
回答
我要稍微重命名你的表:
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]
您想要 < sid > 形式的元組,其中
-- 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]
對此類商店的查詢(可能有多個此類商店)是:
{ s : < sid > | ∀ i ∈ Items ∃ o ∈ Offer [o.sid = s.sid ∧ o.iid = i.iid] }
你的答案 2
我正在尋找 sid,其中對於所有項目,Supplies 表中都有一個對應於 iid 的條目。
就像我的解決方案一樣,這有一個“存在的所有人”。但是您提出的答案 2 有一個“所有的存在”:
{ P | ∃ S1 ∈ Supplies( P.sid = S1.sid ∧ ∀ i ∈ Items(S1.iid = i.iid) )}
這要求元組 P 哪裡有一個提議 S1 在哪裡
$$ P’s sid is S1’s sid and for all Items S1’s iid is that item’s iid $$. 我希望你能看到這涉及到與 Item 中的所有 iid 相同的單個 iid,而不是你想要的。 你的答案 1
{ P | ∃ o ∈ Offer ( P.sid = o.sid ∧ ∀ i ∈ Item (∃ o2 ∈ Offer (o2.iid = i.iid ∧ o2.sid = o.sid)) )}
請注意上面的
∀ ...
意思store o.sid offers every item
。所以:{ P | ∃ o ∈ Offer (P.sid = o.sid ∧ store o.sid offers every item ) )}
如果沒有優惠和一些商店,那麼每個商店都會提供每件商品。但既然沒有優惠,那是假的
∃ o ∈ Offer (P.sid = o.sid))
。沒有 Ps 使之成為現實。所以這是 {}。所以這不是答案。(您的答案 1 可能會根據 Codd 的原始關係除法運算符表達的教科書答案進行修改。但是,除以項目實際上不會返回元組 s where
store s.sid offers every item
。它返回行 wherestore s.sid offers every item AND there is at least one item
。所以答案不是由 Offers/Items 表達的。 )(與你的自然語言描述和我的答案相比,確實 2 有一個額外的 ∃,但它是外部的∃。所以你的解決方案 1 以這種方式讓人想起正確的答案。)