2016-04-28 50 views
1

我正在爲我的多媒體集合創建一個數據庫,我發現自己懷疑自己的設計,這讓我想知道是否有更高效的方法來實現我想要的。可接受的外鍵使用

我想以分層方式設計數據庫。我不會把它全部包括在內,但足夠。

主父表被稱爲MONOLITH。它具有BLOCK_ID和BLOCK_NAME作爲屬性。
的行是:

1, 「INDEX」

2, 「文庫」

然後兩個子表是INDEX和圖書館。前者用於電影,後者用於電視節目。

我開始懷疑數據庫的完整性,因爲電影和電視節目的數據是不同的,並且兩者都不需要相同的屬性,所以我認爲它們應該放在不同的表格中。所以在INDEX表中,每一行的外鍵都是1,而在LIBRARY表中,每一行的外鍵都是2.有沒有明確的錯誤,或者有什麼不同的方法來實現我想要的?這只是一個小例子,還有音樂,文本,音頻書籍和安裝文件,這些都將是MONOLITH桌子上的小孩。它們中的每一個將分別具有用於每一行的相同外鍵。

任何幫助將不勝感激,謝謝!

回答

1

你的觀察結果表明,從表格中攜帶有關音樂,文本等實際信息到巨型表格的鏈接將是多餘的。就你的描述而言,這個龐然大物的表是多餘的,因爲它沒有任何信息不能從其他表中得出。您不需要實現數據庫的內容列表。任何涉及音樂,文字,視頻或其他內容的查詢都應直接轉到包含它們的表格。如果您需要索引,請在這些表中定義它們。

您希望通過標題獲得所有電影,音樂作品等並不需要那個龐然大物的表。你可以做到這一點通過類似

select id, name, "movie" 
from movies 
where name like "Singing%" 

union 

select id, name, "music" 
from music 
where name like "Singing%" 

總之,你的整體方法(這是相當不尋常的)看起來像的東西,可以留到數據庫中,像維護索引自定義實現。

您的文件子文件夾註釋指向您希望爲您的媒體片斷使用流派系統的方向。在數據庫中,以表達這一點的最好方式不是通過單獨的表,但首先有一個表

Genre(id, name, supergenre_id) 

可以用來表達類等級喜歡

1 Pop  null 
2 Brit-Pop 1 
3 Italo-Pop 1 
4 Classical null 
5 Baroque 4 
... 

,然後只是有genre_id屬於每種媒體。數據庫比使用文件系統更靈活。該文件夾結構只允許表示一個層次結構,而對於這種數據庫方案,你可能有許多這樣的例子,例如,心情,儀表等,除了體裁。這就是數據庫樂趣所在。

+0

感謝您的建議。我實際上已經考慮過這種冗餘,但是我將兒童表格連接到MONOLITH的原因是,如果我想查詢選擇所有以「星球大戰」開頭的電影,有聲讀物和小說。我可以通過MONOLITH表運行查詢。此外,我一直認爲數據庫中的所有表都必須在某個時刻連接起來以方便連接等。您是否可以想出一個更好的方法來實現相同的結果?我可以在MONOLITH表中添加更多的列,以減少冗餘。像BLOCK_DESCRIPTION之類的東西。 – Christopher

+0

請注意我編輯的答案。 – TAM

+0

我認爲問題在於我正在考慮用我的文件存儲系統構建數據庫。在文件資源管理器中,第一個文件夾是monolith,然後它有幾個從屬文件夾。一個很好的例子是有聲讀物部分。音頻書籍分爲虛構小說化,非小說小說化,科學,歷史,計算機科學等文件夾。我將重新評估我的數據庫,並將所有音頻書籍數據放入一個表格中,然後嘗試正常化它從那裏。 – Christopher

1

巨石表不起任何作用。正如你在問題描述中所描述的那樣,子表的每一行都有與外鍵列完全相同的值,這不是外鍵的意義。爲了滿足您的要求,您可以定義一個視圖,其中包含此子表中的所有常用屬性。

CREATE OR REPLACE VIEW 
multimedia_collection 
AS 
SELECT id, name, attribute_1, attribute_2, 'MOVIES' AS media_type 
FROM movies 
UNION ALL 
SELECT id, name, attribute_1, attribute_2, 'MUSIC' AS media_type 
FROM music 
UNION ALL 
.... 
.... 

現在,您可以針對此視圖觸發不同的查詢。例如,要查找包含STAR WARS名稱的所有多媒體項目,您可以觸發以下查詢。

SELECT * FROM multimedia_collection 
WHERE name LIKE 'STAR WARS%' 

要找到每種多媒體類型的計數,您可以觸發以下查詢。

SELECT media_type, count(*) FROM multimedia_collection 
GROUP BY media_type 

這些只是一些例子,你可以做更多的事情,一旦你定義的意見。

+0

你們都說得很好。這是毫無用處的,但我一直認爲沒有數據庫表以某種方式連接是不好的做法,因爲它限制了您可以執行的操作,在這種情況下,可以使用任何類型的連接。 UNION雖然工作得很好。我選擇MONOLITH表的原因是因爲我試圖以分層方式進行。 MONOLITH有很多部分,根據部分可能有許多電影,歌曲或有聲書等部分。只要可以,我將刪除MONOLITH,但我的ERD看起來與沒有它的任何我看到的不同。 – Christopher