定義的最佳實踐有很多直通關係
鑑於圖像。有時我需要在不加入主題表的情況下獲取與課程相關的課程。在底部的圖中對Schema進行建模是一種好方法嗎?友善的建議。
所以我會做兩個觀察:
- 正如 Phill W. 所說,加入很好。有時你必須這樣做,而且它不應該是你理所當然地避免的事情。
- 您沒有規範化的數據庫。您有通過指針與其他行關聯的行。你沒有什麼可以保持獨特性。而且您發現您實際上可能需要執行更多連接才能獲得所需的答案。
讓我們擺脫行指針 (
ids
) 並查看數據1的結構:所以你現在會注意到有實際的keys。我無法將“水下籃子編織”插入
Course
1000 次。但是,如果有足夠的數據,這可能會變得有點笨拙,因為名稱往往很大(以字節計),並且作為實際考慮,我們可能希望限制密鑰大小。為此,我們可以在每個表上創建一個新的主鍵,而原來的主鍵現在變成了備用鍵。但是,我們不會丟棄它們,也不會用單個鍵替換它們,因為這會破壞關係:
然而,這仍然有一些不足之處。
CourseId
,TopicId
, 和LessonId
是沒有意義的。我們仍然需要查詢表以獲取系統生成的標識符,以便訪問我們需要的數據,因為沒有人會知道“數據庫設計中的高級主題”實際上是CourseId = 12451853
.在任何企業或企業中,人們都會自然而然地為普通事物創造速記。想想郵政編碼、元件號等。這些被理解為等同於數據庫上下文**之外的實體名稱。**如果可能,我們應該使用這些(或創建它們)來促進兩件事:
- 我們不需要創建另一個備用密鑰來確保它們是唯一的。
- 可以更直接地訪問數據庫,而不需要查找無意義的
ids
.- 換位錯誤(插入
(1,3,2)
而不是(1,2,3)
)的機會被消除或大大減少。像這樣的東西更接近理想狀態:
有意義的鍵意味著需要讀取更少的數據來從給定查詢中返回所需的結果。程式碼更整潔,錯誤導致插入失敗,而不是無效數據。如果我需要 CS101 - Introduction to Keyboards 的課程,我可以這樣做:
SELECT CourseCode ,TopicShortName ,LessonShortName ,LessonName ,Description FROM Lesson WHERE CourseCode = 'CS101'
我相信這是您想要的結果。
1通常對使用者隱藏的系統生成的值不是數據- 它是指針或關聯。這並不是說系統生成的東西永遠不是數據(想想發票或保單號碼),但它們通常需要暴露在數據庫本身之外。
有時我需要在不加入主題表的情況下獲取與課程相關的課程。
為什麼?
主題表不會去任何地方,所以為什麼不讓它發揮作用呢?將課程(間接)連結到課程?
您不必在查詢中返回主題表中的任何欄位…
select c.title course_title , l.title lession_title from courses c inner join topics t on c.course_id = t.course_id inner join lessions l on t.topic_id = l.topic_id order by 1, 2 ;