3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
ER表示法
有幾種ER符號(hào)。我不熟悉你正在使用的那個(gè),但很明顯你試圖表示一個(gè)子類(lèi)型(又名繼承,類(lèi)別,子類(lèi),泛化層次......)。這是OOP繼承的關(guān)系表親。
在進(jìn)行子類(lèi)型分析時(shí),您通常會(huì)關(guān)注以下設(shè)計(jì)決策:
摘要與具體:父母可以實(shí)例化嗎?在你的例子中:可以
Vehicle
存在而不是存在2WD
或4WD
?1包容性與排他性:可以為同一個(gè)父母實(shí)例化多個(gè)孩子嗎?在你的榜樣,可以
Vehicle
是既2WD
和4WD
?2完整與不完整:您希望將來(lái)能夠添加更多兒童嗎?在您的示例中,您是否希望稍后可以將a
Bike
或Plane
(etc ...)添加到數(shù)據(jù)庫(kù)模型中?
信息工程表示法區(qū)分包容性和排他性子類(lèi)型關(guān)系。另一方面,IDEF1X表示法沒(méi)有(直接)識(shí)別這種差異,但它確實(shí)區(qū)分了完整和不完整的子類(lèi)型(IE沒(méi)有)。
從下圖ERwin的方法指南(第5章,子類(lèi)型關(guān)系)示出的區(qū)別:
IE和IDEF1X都不能直接指定抽象與具體父級(jí)。
物理表征
遺憾的是,實(shí)際數(shù)據(jù)庫(kù)不直接支持繼承,因此您需要將此圖轉(zhuǎn)換為實(shí)際表。這樣做通常有3種方法:
將所有類(lèi)放在同一個(gè)表中,并將子字段保留為NULL。然后,您可以使用CHECK來(lái)確保非NULL中的字段的正確子集。
優(yōu)點(diǎn):沒(méi)有加入,所以一些查詢可以受益??梢詮?qiáng)制執(zhí)行父級(jí)別的密鑰(例如,如果您想要避免不同的
2WD
和4WD
具有相同ID的車(chē)輛)。可以輕松地強(qiáng)制執(zhí)行包容性與獨(dú)占子項(xiàng)以及抽象與具體父級(jí)(僅通過(guò)改變CHECK)。缺點(diǎn):有些查詢可能會(huì)變慢,因?yàn)樗鼈儽仨氝^(guò)濾掉“不感興趣”的孩子。根據(jù)您的DBMS,特定于子項(xiàng)的約束可能會(huì)有問(wèn)題。很多NULL都會(huì)浪費(fèi)存儲(chǔ)空間。不太適合不完整的子類(lèi)型 - 添加新子項(xiàng)需要更改現(xiàn)有表,這在生產(chǎn)環(huán)境中可能會(huì)有問(wèn)題。
將所有子項(xiàng)放在單獨(dú)的表中,但沒(méi)有父表的表(而是在所有子項(xiàng)中重復(fù)父項(xiàng)的字段和約束)。具有(3)的大多數(shù)特征,同時(shí)避免JOIN,以較低的可維護(hù)性(由于所有這些字段和約束重復(fù))和無(wú)法強(qiáng)制執(zhí)行父級(jí)鍵或代表具體父級(jí)的代價(jià)。
將父項(xiàng)和子項(xiàng)放在單獨(dú)的表中。
優(yōu)點(diǎn):清潔。不需要人為地重復(fù)字段/約束。實(shí)施父級(jí)鍵并輕松添加特定于子級(jí)的約束。適合不完整的子類(lèi)型(相對(duì)容易添加更多的子表)。某些查詢只能通過(guò)查看“有趣的”子表來(lái)獲益。
缺點(diǎn):有些查詢可能很重要??赡茈y以強(qiáng)制執(zhí)行包容性與獨(dú)占子級(jí)以及抽象與具體父級(jí)(如果DBMS支持循環(huán)和延遲外鍵,則可以聲明性地強(qiáng)制執(zhí)行,但在應(yīng)用程序級(jí)別強(qiáng)制執(zhí)行它們通常被認(rèn)為是較小的惡意)。
正如您所看到的,情況并不理想 - 無(wú)論您選擇何種方法,您都需要妥協(xié)。方法(3)應(yīng)該是你的出發(fā)點(diǎn),如果有令人信服的理由,只選擇其中一種方案。
1我猜這是你的圖表中線條的粗細(xì)。
2我猜這是你的圖表中存在或不存在“不相交”的含義。
添加回答
舉報(bào)