2012-03-12 34 views
0

我正在爲一個簡單的數據庫編寫一個簡單的Python接口。數據庫是一個簡單的數據庫,它存儲哪個特定曲目在哪個活動中以及由哪個藝術家播放。 Python中的接口還不是問題,儘管數據庫的設計是。我想出了以下事情:用於舞蹈事件曲目列表存儲的數據庫設計

--- EVENTS --- 

CREATE TABLE events (
    id INTEGER PRIMARY KEY autoincrement, 
    event_name TEXT NOT NULL, 
    event_date TEXT NOT NULL, 
    <list of tracklist-ids - foreign key?> 
); 

--- TRACKLISTS --- 

CREATE TABLE tracklists (
id INTEGER PRIMARY KEY autoincrement, 
artist TEXT NOT NULL, 
<list of track-ids - foreign key?> 
); 

--- TRACKS --- 

CREATE TABLE tracks (
id INTEGER PRIMARY KEY autoincrement, 
trackartist TEXT NOT NULL, 
trackname TEXT NOT NULL, 
timesplayed INTEGER NOT NULL, 
); 

它只是不覺得邏輯對我來說,我需要的方式來許多操作得到一些簡單的事情了數據庫,幾個例子:

  • 獲取藝術家A在2006年至2009年期間播放的歌曲(曲目)列表:需要循環播放「曲目列表」以獲取藝術家A的每個曲目組,然後在「活動」表中查找它(這已經很痛苦,如何存儲清單?)

  • 查找該藝術家播放的曲目一個最次數:貫穿整個「tracklists」表循環,並得到某種計數器看起來對的TrackID曲目一

它可能會變得有點混亂,因爲我說的關於很多不同的事情,但對我來說,似乎我的數據庫可以設計得更好,或者我應該使用某種其他方法來以數據庫方式處理這個程序?我正在尋找一個基本的起點或提示/技巧來讓這個數據庫更高效和更好。我知道不是每個查詢都可以很快,但對我來說這似乎不是很有效。另外,有沒有更好的方式將列表存儲到SQL數據庫中,而無需將它們存儲到字符串中?

回答

2

我同意Jens Schauder的觀點,你想讓DBMS擔心過濾和計算,但是我不同意表的列表沒有問題,因爲OP提議的內容沒有被標準化。這不是一個小問題,因爲它會阻止DBMS的工作。

此外,重要的是,這個想法並不是保持一個曲目播放多少次的運行軌跡,而是保持每次播放曲目的記錄。不同的是,你想存儲的是事件的歷史,而不是事件的概要。

你想要什麼表,看起來更像是這樣的:

--- EVENTS --- 

CREATE TABLE events ( 
    id INTEGER PRIMARY KEY autoincrement, 
    event_name TEXT NOT NULL, 
    event_date TEXT NOT NULL, 
); 

--- ARTISTS --- 

CREATE TABLE artists (
    id INTEGER PRIMARY KEY autoincrement, 
    artist_name TEXT NOT NULL 
); 

--- TRACKS --- 

CREATE TABLE tracks ( 
id INTEGER PRIMARY KEY autoincrement, 
trackname TEXT NOT NULL, 
artist_id INTEGER, 
FOREIGN KEY(artist_id) REFERENCES artists(id) 
); 

--- PERFORMANCES --- 

CREATE TABLE performances (
    id INTEGER PRIMARY KEY autoincrement, 
    event_id INTEGER, 
    track_id INTEGER, 
    FOREIGN KEY (event_id) REFERENCES events(id), 
    FOREIGN KEY (track_id) REFERENCES tracks(id) 
); 

此表結構是第三範式(3NF)和將很容易都寫入和查詢。

+0

非常有趣,有些問題:如果我有10個同名的曲目和三個不同的藝術家,它仍然會在曲目表中創建10個條目?這不是浪費空間嗎?其次;你鏈接的event_id <-> track_id,有這個特定的原因? – wvd 2012-03-12 15:53:09

+0

@wvd - 鏈接event_id和track_is就像是說「這個曲目是在這個活動中播放的」。關鍵是要記錄事情發生的事實。你數了事後發生的事情,而不是在你錄製它的時候。這是一個更好的方法,原因很多。關於你關於10首曲目和三位藝術家的問題,我不確定我是否跟着你。你的意思是三位藝術家合作了10首不同的歌曲,還是你的意思是說,來自3位不同藝術家的10首獨立歌曲是在一個事件中進行的?你能舉一個例子(甚至是一個化妝)嗎? – 2012-03-12 19:46:15

+0

我明白你的想法。看起來很聰明。我在表格[這裏](http://pastebin.com/uE2C1PtJ)寫下了一些條目,唯一的問題是:藝術家可以製作和播放曲目。用你的方法,我永遠不能說「藝術家X在大部分時間都演奏過A曲」。 – wvd 2012-03-12 20:41:58

0

乍一看,你的數據庫看起來很好,只有一個例外,你不會在一個表中存儲一個id列表,而是從另一個表中返回該表的引用。

的循環您介紹的就是在使用「計數」和「加入」

數據庫是非常好,速度快,在計算和查找在數據庫中完成99%的情況。

如果您需要詳細的幫助,您的sql語句應該如何讓他們看到新的問題。

+0

謝謝:),很高興看到perfomance是否好得多,我認爲它*可以*。 – wvd 2012-03-12 09:50:57