1

我有關於音樂相冊的信息,我想在RDBMS表格中組織它們之間的關係。我有每個專輯的以下信息:藝術家,專輯名稱,年份,標籤,流派,風格,評級。到目前爲止,我認爲要製作4張表格 - 藝術家,專輯(名稱,年份,標籤,評級),流派1和流派2(每種流派都有其風格)。在這張圖上,它看起來如下:關於表格間設計關係的建議

enter image description here

但是還不知道如何建立相冊和其他三個表之間的連接?即,當我將運行查詢select name from artists我希望收到一個具有相應藝術家和流派風格的專輯。

在這種情況下我應該如何建立表格之間的關係?

回答

0

您需要閱讀關係數據庫表&查詢簡介。

您所說的表格之間的「關係」[原文如此]是FK(外鍵)。 FK表示表中列的列表的值顯示爲表中某些列的其他列的值,這些列在表中形成PK(主鍵)或UNIQUE。您不需要聲明或使用FK進行查詢。像所有約束一樣,包括PK & UNIQUE,它們用於DBMS排除錯誤的數據庫狀態。

A(基本或查詢結果)代表(商業/應用)關係(船)/關聯。一張表包含來自關聯的謂詞(語句模板)的一些真實命題(語句)的行。基表的謂詞由DBA給出。查詢結果表的謂詞遵循用戶查詢表達式中的基表,關係運算符&邏輯運算符。即JOIN的謂詞是其謂詞的AND;聯合OR; AND NOT NOT除外; ON和WHERE條件AND條件與JOIN謂詞; etc

-- artist A has name N 
Artist(A, N) 
-- album A has name N and ... 
Album(A, N, ...) 
-- genre G has name N 
Genre(G, N) 
-- artist A authored album A2 
ArtistAlbum(A, A2) 
-- album A is of genre G 
AlbumGenre(A, G) 

SELECT DISTINCT ... 
FROM 
    --  album ag.A is of genre ag.G AND genre g.G has name g.N ... 
    -- AND ag.G = g.G ... 
    AlbumGenre ag JOIN Genre g ON a.G = g.G ... 

注意不要緊多少流派的專輯可以有或者多少張專輯流派可以有或流派是否可以有多個ID和/或名稱,查詢仍返回行時,滿足那個謂詞。 約束(包括FK)不需要查詢或更新。

請注意,我們可以應用相同的謂詞變換加上其他變量來編寫約束。 (我使用A作者&專輯,所以我不得不在這裏給一個重命名的例子。)

-- for all A & A2, if artist A authored album A2 then artist A has some name 
-- for all A & A2, if artist A authored album A2 then for some N, artist A has name N 
-- for all A & A2, if (A, A2) in ArtistAlbum then for some N, Artist(A, N) 
-- SELECT A FROM ArtistAlbum ⊆ SELECT A FROM Artist 
FOREIGN KEY ArtistAlbum (A) REFERENCES Artist (A) 

-- for all A & A2, if artist A authored album A2 then album A2 has some name 
-- for all A & A2, if artist A authored album A2 then for some N, ..., album A2 has name N and ... 
-- for all A & A2, if (A, A2) in ArtistAlbum then for some N, ..., (A2, N, ...) in Album 
-- SELECT A2 FROM ArtistAlbum ⊆ SELECT A AS A2 FROM Album 
FOREIGN KEY ArtistAlbum (A2) REFERENCES Album (A) 

-- for all A & G, if album A is of genre G then album A has some name and ... 
-- for all A & G, if album A is of genre G then for some N, ..., album A has name N and ... 
-- for all A & G, if (A, G) in AlbumGenre then for some N, ..., (A, N, ...) in Album 
-- SELECT G FROM AlbumGenre ⊆ SELECT A FROM Album 
FOREIGN KEY AlbumGenre (A) REFERENCES Album (A) 

-- for all A & G, if album A is of genre G then genre G has some name 
-- for all A & G, if album A is of genre G then for some N, genre G has name N 
-- for all A & G, if (A, G) in AlbumGenre then for some N, (G, N) in Genre 
-- SELECT G FROM ArtistAlbum ⊆ SELECT G FROM Genre 
FOREIGN KEY AlbumGenre (G) REFERENCES Genre (G) 

不是有兩個表的專輯& AlbumGenre和他們的FK,我們可能只是Album2那是他們的加盟,與謂詞是他們的謂詞album A has name N and ... and album A is of genre GFOREIGN KEY Album2 (G) REFERENCES Genre (G)的AND /連詞。然後正常化會告訴我們,如果每張專輯有一個類型,那麼這是一個好的設計,但否則,原來更好。同樣,Artist2將ArtistAlbum結合到Artist中(如果藝術家創作了一張專輯,則是合理的)。或者兩個ArtistAlbum & AlbumGenre放入Album3(如果專輯有一個作者和一個流派,則是合理的)。但不管所有重要的查詢&更新是謂詞,而不是基數或約束。

因此,您的設計缺少類似ArtistAlbum & AlbumGenre的相應謂詞/列/表格。 (您可能希望與上面的其他表格結合使用。)

PS您的問題不清楚「流派」,「流派1」&「流派2」。

-1

底線是你需要外鍵。您的表格當前每個表名爲id都有一個不同的id:

artist.id 
artist.name 
album.id 
album.album 
album.year 
album.label 
album.rating 
genre.id 
genre.name 
genre.id 
genre.name 

關鍵詞在這裏是「關係」。你需要關聯這些表格。

artist.artist_id 
album.album_id 
genre.genre_id 

然後在專輯表,您將添加列artist_id和genre_id這樣你就可以加入他們回到藝術家和流派表

沒有:也許你會被命名你的IDS更好地設計這個FKs,你將有一個笛卡爾產品。就那麼簡單。

+0

然後在'album'表中,我需要添加一個'artist_id'和'genre_id'列,它將指向'artist'和'genre'表中的相應行? 我想過兩個'genre'表,因爲一個會用於搖滾,另一個用於爵士。 –

+0

我編輯我的帖子來解決你的第一個問題。關於流派,您在創建2個流派表中完全擊敗了表格的目的。爵士隊是擁有自己的關鍵的一排,洛克是另一排有自己的關鍵。這與您爲什麼不爲每位藝術家建立表格或每張專輯的表格是相同的概念。 – fleetmack

+1

@VitaliiPlagov&fleetmack PKs/UNIQUEs&FKs不需要查詢。例如,只要連接處於ON狀態,就不會有交叉產物,即不必是PK/UNIQUE或FK,即一列不具有*爲另一列的子集這是PK/UNIQUE(即FK),並不需要與PK/UNIQUE進行比較。看到我的答案。 – philipxy