[英]Relational schema for a book graph
我制作了下圖來顯示與它們有關系的書籍和人物:
有兩個節點:
和三個關系(及其屬性,圖中未顯示):
如果這要在關系數據庫中建模,架構會是什么樣子? 我的想法是打破每一個關系和節點,比如:
節點人
節點書
邊讀
邊寫
邊緣評論
或者,所有節點都應該是一個表嗎? 如果我們要添加 Movies 作為另一個節點,我們將如何顯示 Review 邊緣可能來自 Person->Book 或 Person->Movie 的 go。 似乎更通用的方法可能是:
節點:
邊緣:
改用這種后一種方法有什么缺點嗎?
注意relational-database
標簽。
首先,我們需要了解這個問題存在的整個背景,包括各種可用的方法; 每個人的能力; 和限制(如果有)。 之后,很容易理解解決方案。 在關系范式中只有一個正確的解決方案。
在 Codd 產生他的關系 Model (1970) 之前,已經有 20 年非常好的 DBMS。 此外,供應商花了 10 多年的時間才生產出真正的 RDBMS(1981 年)。 在那些日子里,計算機和軟件很昂貴,而且是專有的。
雖然鍵是合乎邏輯的,但指針當然是物理的。 系統因此受到限制。
出於對科學(邏輯;理智)的熱愛,沒有實現循環引用(循環圖)。 換句話說,只有真實的層次結構(有向無環圖;樹),因為它們存在於現實世界或人造世界中的邏輯,被實施。
第一個基於或建立在邏輯上的,具有數學定義的,這使得它被稱為Model 。 它改變了 DBMS 的世界。 與此問題相關的主要區別是:
EF Codd 博士是一名工程師,他與科學家一起為 IBM 工作。 同樣,其他 DBMS 供應商也有科學家和工程師。
學術界討厭 Codd 和IDEF1X ,因為它們完全脫離現實,完全與行業和 DBMS 供應商隔絕。 他們使用和撰寫只有學者炮制的東西。 那時,一直到現在:
他們否認 SQL 兼容平台的現實,並培養了一種不兼容甚至不是語言的“sql”;
他們抑制了IDEF1X,而是培養了對建模毫無希望的ERD,並且無法處理關系鍵(復合)並且不能用於任何類型的建模
他們討厭科德和像我這樣的從業者,因為我們不是學者,我們是現實主義者
他們壓制了邏輯關系 Model ,並推廣了 1960 年代(DBMS 之前)的物理記錄歸檔系統,欺詐性地宣傳為“關系”。 這些以RecordIDs
(物理記錄,而不是邏輯行)為特征。
RecordIDs
不提供RM中要求的行唯一性,以防止重復數據。 (它們確實提供RecordID
唯一性,這完全無關緊要,更糟糕的是,您可能認為您已經防止了數據重復,而實際上您沒有RecordIDs
總是一個額外的非數據字段,並且比關系等價物多一個額外的索引。JOINs
。 有關討論,請參閱:
僅使用 2 個不同的 auto_increment §1 和 2 創建關系表。
因此,由於對RM的無知,他們提出了愚蠢的主張,例如“ RM不能做這個或那個”,這對他們的“RM”來說是正確的,但對於 Codd 的RM來說是完全錯誤的。
同樣,Codd 定義了一種單一的數據子語言,並且主要供應商(不包括 Oracle)實現了它。 那是真正的 SQL,它被制定為 ANSI->ISO/IEC 標准。 有一篇著名的論文Codd’s Twelve Rules for compliance with his data sub-language,各大廠商都遵守,免費軟件甚至都沒有接近。
免費軟件和 Oracle 不符合 SQL,他們使用 SQL 一詞是欺詐性的。 Postgres 和 Oracle 中的實現甚至不是一種語言。
因此,再次由於對RM和SQL的無知; 他們與現實和行業隔離開來; 以及他們對私有“RM”和“SQL”的執着,他們做出愚蠢的聲明,例如“SQL 不能做這個或那個”,這對他們的“SQL”和他們的“RM”來說是正確的,但對於他們的“RM”來說是歇斯底里的錯誤。真正的RM和 SQL。
這導致世界上 95% 的數據庫被標記為“關系型”,但它們根本不是關系型的,它們不提供關系型 Model的任何功能和優點。 當然,它不會按預期工作。 因此,從關系(實際上是“關系”)轉向各種非關系“數據庫”。
該塊最新的孩子是“圖形數據庫”,它根本不是數據庫(沒有完整性,沒有標准),但它們確實提供了“關系”或“SQL”據稱無法提供的功能或 function。 同時,實際上,在 Codd 的關系型 Model和真正的 SQL 中,沒有什么是無法定義的,並且數據層次結構(DAG;圖表;樹)易於設計和實現。
值得注意的是,IBM 專門委托 Codd 解決的一個問題是他們的 HDBMS 中的一個特定問題,該問題涉及著名的物料清單問題,他確實解決了這個問題並且非常出色。 即RM完全支持各種dat層次結構,普通【正版】SQL可以用來導航。
三個問題是典型的。
首先,理解上面的上下文,這樣你就會明白你已經被反關系的廢話轟炸了,這些廢話不能將各種邏輯數據結構(例如圖形)處理為“關系”,並且關系和 SQL 可以很好地處理所有這些結構。
第二個問題是常見的開發人員心態,他們專注於他們的 GUI; 皮膚,以及他們對數據的需求。 (我知道我需要什么,以及 GUI 的樣子)這很容易,因為學者們建議他們根據 Excel 電子表格(可怕的RecordIDs
)來思考。 確切地說,而不是數據是什么。
第三,可能最重要的是,分析和建模數據的科學和方法與分析的科學和方法非常不同。 設計; 和建模過程。 不幸的是,如今的開發人員被 OO/ORM 迷住了,因為完全錯誤的觀念是,宇宙中的一切都可以通過 Object 的鏡頭來感知和理解。
現在我們有了上面的上下文和解釋,我們可以考慮您提供的圖表。 請注意,這是一張圖片,而不是任何類型的 model,它專注於、描述了一些示例數據以及該示例數據之間的一些可能關系。 還有一張好看的圖。
如果這要在關系數據庫中建模,架構會是什么樣子?
因此,我會要求您釋放所有關於以下內容的概念:
RecordIDs
(謹防反關系欺詐性地冒充“關系”), 這是純粹的關系。 它可以在任何真正的 SQL 平台(不包括免費軟件和 Oracle)中實施,並且可以毫不費力地工作。 任何和所有報告都將通過單個SELECT
提供。 順序跟隨你的問題。
如果這要在關系數據庫中建模,架構會是什么樣子? 我的想法是打破每一個關系和節點,比如:
是的。 忽略小錯誤,這就是 Normalization 的樣子。
我們可以刪除以圖形為中心的名稱,因為數據庫旨在反映現實,而不是許多可能的用途之一就是從中生成圖形。 它可用於從數據中提供任何報告,而不僅僅是圖表。
關系數據建模的第一次迭代,在 IDEF1X 中給出。
或者,所有節點都應該是一個表嗎?
不,那將是一個平面文件,完全未標准化。 實施的怪物; 維持; 和SELECT
來自。 它沒有聲明性引用完整性,因此它不符合數據庫的條件,更不用說關系數據庫了。
如果我們要添加 Movies 作為另一個節點,我們將如何顯示 Review 邊緣可能來自 Person->Book 或 Person->Movie 的 go。
忘記“邊緣”,它只是多種可能的顯示類型之一,而專注於數據和關系,它支持任何類型的顯示。
每一個( Person; Book; Movie
)都是一個單獨的、離散的事實(“節點”),每個箭頭都是一個單獨的、離散的關系,具有明確的動詞短語。
您已經添加了 Movie 實體,這需要大量額外的建模。 用於定義Book
或Movie
的Item
的普通 pre-Relational(60 年代和 70 年代)和 Relational(80 年代)方法是子類型集群。
似乎更通用的方法可能是:...
你的屬性不完整。 當您添加相關屬性時,您最終會得到兩個未標准化的文件,其中包含可為空的字段。 與數據庫截然相反,通常是維護和使用的噩夢。
從物種轉移到屬不是一個非黑即白的決定,認為它“總是好的”是一個嚴重的錯誤。 關系型 Model ,特別是正確的子類型,實現了屬(基本類型)和物種(子類型),因此可以無限使用。
改用這種后一種方法有什么缺點嗎?
是的。 違背科學或涵蓋某個主題的標准總是有可怕的缺點。 列舉幾個:
FOREIGN KEY
)是不可能的,因此數據沒有完整性試試這個,這是我們建模練習中的第二次迭代。 我已經實現了以下規則(隨意更改或添加更多規則,我將更新數據模型):
Item
要么是Book
,要么是Movie
,或兩者兼而有之%Reviewer
必須首先是Reader/Viewer
Author.Sequence
是唯一的,即。 兩位Authors
不能共享“第二名”
CONSTRAINT
以確保增量Sequence
,在這種情況下可以刪除AK
PDF 中的數據model
如果您在顯示數據庫中的數據時遇到任何困難,以任何報告或圖表的形式,使用標准 SQL,請指出,我將提供 SQL。
請隨時提出問題,或提供您的要求的進一步定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.