[考題] 資料庫 ER diagram轉relation問題

看板Examination (國家考試)作者 (阿瑜)時間13年前 (2013/06/28 19:43), 編輯推噓12(12052)
留言64則, 5人參與, 最新討論串1/1
https://www.dropbox.com/s/juy2yszkfo34kr3/%E6%8E%83%E6%8F%8F0001.jpg
上面的連結是一張ER diagram 在SHIP_AT_PORT這個三元關係,怎麼轉都覺得怪怪的耶, 所以貼來版上,想跟大家討論看看這個要怎麼轉, 希望大家不吝指教,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.24.135.35

06/28 20:18, , 1F
ship&port主鍵放進去就好不是嗎?
06/28 20:18, 1F

06/28 20:19, , 2F
基本上多對多關係你就要成立一個關聯表
06/28 20:19, 2F
好像不是耶,SHIT_AT_PORT這個三元關係不是全都是多對多的關係,我無法從他標示 的(0,*) (0,*) (1,1) 來判斷哪邊是1 哪邊是N 哪邊是M, 不知道我這樣表達能看懂 我的意思嗎? ※ 編輯: lordfish62 來自: 114.24.135.35 (06/28 20:49)

06/28 20:51, , 3F
我就知道你想問這個= = ...
06/28 20:51, 3F

06/28 20:51, , 4F
post_visit是弱實體
06/28 20:51, 4F

06/28 20:52, , 5F
SHIT_AT_PORT一個表 內容是port&port的主鍵
06/28 20:52, 5F

06/28 20:52, , 6F
然後其主鍵是port主鍵跟ship主鍵的結合體
06/28 20:52, 6F

06/28 20:53, , 7F
該主鍵放到post_visit裡面當作限制
06/28 20:53, 7F

06/28 20:53, , 8F
於是弱實體也完成
06/28 20:53, 8F

06/28 20:54, , 9F
說得簡單一點就是{ship,port}→ship_at_port
06/28 20:54, 9F

06/28 20:55, , 10F
ship_at_port→port_visit
06/28 20:55, 10F

06/28 20:55, , 11F
關聯表之間的相依限制大概像這樣y
06/28 20:55, 11F

06/28 20:56, , 12F
然後post_visit... 一定是少了船或者港口都不行
06/28 20:56, 12F

06/28 21:01, , 13F
SHIT_AT_PORT一個表 內容是ship&port的主鍵 上面打錯
06/28 21:01, 13F

06/28 21:02, , 14F
順便說 一對多關係你用補習班教的方法去判斷很囧...
06/28 21:02, 14F

06/28 21:02, , 15F
一艘船可以停在多個港口 一個港口可以停很多船
06/28 21:02, 15F

06/28 21:03, , 16F
很直覺... 所以用直覺就好... 唸起來順的時候多半對
06/28 21:03, 16F

06/28 21:03, , 17F
別忘了資料庫往往都嘗試著表現真實世界的對應關係
06/28 21:03, 17F

06/28 21:03, , 18F
PORT本身也是弱實体這樣做還是錯的也要吧用來決定PORT的另
06/28 21:03, 18F

06/28 21:04, , 19F
外兩個KEY也拉進來
06/28 21:04, 19F

06/28 21:05, , 20F
post的弱實體關係與船無關 與國家、湖海那兩個有關系
06/28 21:05, 20F

06/28 21:05, , 21F
所以實際上拉去的鍵值應該是國家與湖海的主鍵
06/28 21:05, 21F

06/28 21:06, , 22F
但這樣他八成會亂掉XD
06/28 21:06, 22F

06/28 21:08, , 23F
我英文一直打錯是怎樣= =
06/28 21:08, 23F
謝謝你們熱心的幫忙,我知道PORT是STATE/COUNTRY的弱個體, PORT_VISIT應該是SHIP的弱個體,若是三元關係SHIP_AT_PORT產生一個新表格, 應該要把PORT的完整主鍵放進來,也就是StateCountryName, Pname 但我附上他給的解答, https://www.dropbox.com/s/lhdxdpv862x0ayl/%E6%8E%83%E6%8F%8F0002.jpg
感覺他把這個三元關係直接放在PORT_VISIT這個表格裡, 沒有產生新的表格 另外,SHIP這個表格的內容好像也缺了,(Sname, Owner, Type 之後應該還要放個StateCountryName, PName 來表示HOME_PORT這個關係吧 我亂掉了@@ ※ 編輯: lordfish62 來自: 114.24.135.35 (06/28 21:29)

06/28 21:43, , 24F
是的,缺了,答案是錯的
06/28 21:43, 24F

06/28 21:43, , 25F
一般正常來說,資料結合是越簡單越好
06/28 21:43, 25F

06/28 21:44, , 26F
假設ship_at_port不建立表格 那船隻停靠港口的資料
06/28 21:44, 26F

06/28 21:44, , 27F
答案應該是沒有錯的 你可以用兩個角度去看PORT_VISIT
06/28 21:44, 27F

06/28 21:44, , 28F
就會變得需要依靠port_visit來查詢
06/28 21:44, 28F

06/28 21:45, , 29F
當然你也可以這樣解決就是了...
06/28 21:45, 29F

06/28 21:45, , 30F
一個是你說的 用三元關係 那麼轉出來就不是解答這樣
06/28 21:45, 30F

06/28 21:46, , 31F
只是這樣的結合會產生資料耦合過高問題XD
06/28 21:46, 31F

06/28 21:46, , 32F
當然解答是用PORT_VISIT同時依附在SHIP跟PORT上面的角度去做
06/28 21:46, 32F

06/28 21:47, , 33F
如同ARCHERDEVIL大所說的為了簡單所以解答不是用三元關係去解
06/28 21:47, 33F

06/28 21:52, , 34F
拍謝 以上是針對PORT_VISIT
06/28 21:52, 34F

06/28 21:52, , 35F
SHIP後面要再加上StateCountryName, PName 當作FK是沒錯的!!
06/28 21:52, 35F
謝謝你們的說明,如果以PORT_VISIT同時依附SHIP及PORT的角度來看,答案就很合理, 但是如何判斷他是同時依附呢? 有沒有一種情況是一樣中間的關係是雙框的三元關係,但那個弱個體只依附另兩個個體 中的其中一個? ※ 編輯: lordfish62 來自: 114.24.135.35 (06/28 22:10)

06/28 22:13, , 36F
這種狀況不排除有,但應該不多。
06/28 22:13, 36F

06/28 22:14, , 37F
基本上port-visit裡的屬性可以放到ship_at_port裡面
06/28 22:14, 37F

06/28 22:14, , 38F
圖會這樣畫有兩個原因
06/28 22:14, 38F

06/28 22:14, , 39F
第一,降低資料耦合 提高資料安全
06/28 22:14, 39F

06/28 22:15, , 40F
第二 可能船待在港口的時間只能確定開始 結束不確定
06/28 22:15, 40F

06/28 22:15, , 41F
然後又不允許空值
06/28 22:15, 41F

06/28 22:16, , 42F
所以寫入的時候只好放到另外一個表裡面去維持完整性
06/28 22:16, 42F

06/28 22:16, , 43F
當然這是腦補就是了
06/28 22:16, 43F

06/28 22:17, , 44F
至於怎麼判斷... 我是靠腦補...
06/28 22:17, 44F

06/28 22:17, , 45F
或者是直接靠轉換規則...
06/28 22:17, 45F

06/28 22:17, , 46F
絕大部分的書應該都有寫
06/28 22:17, 46F

06/28 22:18, , 47F
多對多關係要轉一個表出來 弱實體一定相依於主實體
06/28 22:18, 47F

06/28 22:18, , 48F
然後加上一點想像力...
06/28 22:18, 48F

06/28 22:22, , 49F
我想只能從語意上去判斷 SHIP_AT_PORT應該同時依附SHIP跟PORT
06/28 22:22, 49F

06/28 22:23, , 50F
應該算合理 當然你這題可以用三元去解 解出來的主鍵也是一樣
06/28 22:23, 50F

06/28 22:27, , 51F
是說如果你不嫌麻煩 也可以用lossless join判斷
06/28 22:27, 51F
了解,所以要靠語意來判斷,我會有這樣的疑問,是因為補習班老師的教法,有說到同樣 是三元關係,但如果關係上對應的數量關係不一樣,轉換出來的relation也會不同,下面 的連結是我抄的筆記 https://www.dropbox.com/s/wrm51gi5kgp7lwc/%E6%8E%83%E6%8F%8F0004.jpg
所以在這個題目上,他用(0,*)(1,1)這樣的方式來標示這個三元, 我沒有辦法判斷哪邊是1, M, N 才會一直覺得很困惑,到底該用什麼規則來轉換這個關係 ※ 編輯: lordfish62 來自: 114.24.135.35 (06/28 22:43)

06/28 22:56, , 52F
就跟M N方式剛好相反。1:N關係應該是(0,*):(1,1)
06/28 22:56, 52F

06/28 22:56, , 53F
如果我沒記錯應該是這樣
06/28 22:56, 53F

06/28 22:57, , 54F
提外問一下 原po解答的SHIP表當中是否要再多一個Pname外鍵呢
06/28 22:57, 54F

06/28 22:58, , 55F
否則是不是就少了 判斷某船的home port關聯了
06/28 22:58, 55F

06/28 22:58, , 56F
賓果
06/28 22:58, 56F
ARCHERDEVIL大,你說的(0,*):(1,1),只有逗號右邊的是代表1:N 逗號左邊的是表示這個實體是全部參與,還是部分參與 所以這樣標示的方式在二元關係中沒問題,但在三元關係中, 以我這個題目中的POST_VISIT是(1,1),PORT是(0,*) 那麼SHIP我到底應該看(1,1)中逗號右邊的1 還是看(0,*)中逗號右邊的*來判斷呢 ※ 編輯: lordfish62 來自: 114.24.135.35 (06/28 23:08)

06/28 23:04, , 57F
再藉這題問一下大家 1對多轉關聯有一種作法是跟多對多一樣
06/28 23:04, 57F

06/28 23:05, , 58F
就是直接把關係拉出來 成立一個關聯表 再放入1跟多方的主鍵
06/28 23:05, 58F

06/28 23:05, , 59F
你們寫這類題目時會這樣作嗎
06/28 23:05, 59F

06/28 23:17, , 60F
我個人感覺,應該沒有必要這樣做吧,在原本的表加外鍵
06/28 23:17, 60F

06/28 23:18, , 61F
跟多一個關聯表,感覺多一個表比較複雜
06/28 23:18, 61F

06/28 23:33, , 62F
這樣資料結構耦合就變高了 join起來效率很差
06/28 23:33, 62F

06/28 23:58, , 63F
最好是把1方的KEY加入多方為外KEY就好,這樣反而會浪費空
06/28 23:58, 63F

06/28 23:58, , 64F
06/28 23:58, 64F
文章代碼(AID): #1HpNRR3x (Examination)
文章代碼(AID): #1HpNRR3x (Examination)