2012-03-12 2 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, 
    ); 
    

    、私はいくつかのデータベースのうち簡単なもの、いくつかの例を得るために多くの操作に方法が必要です

  • 2006年から2009年にアーティストAが演奏した曲(トラック)のリストを取得するには、 'tracklists'テーブルをループしてアーティストAのすべてのtracklistidを取得し、 'events'テーブルで検索しますそれは既に痛みです、どのようにリストを保存する?)

  • ルックアップ私が話しているので、それは少し混乱になるかもしれません

を全部「tracklists」テーブルをループし、トラックのtrackid探しカウンタのいくつかの並べ替えを取得する:どのアーティストがトラックAを何回のほとんどを果たしました私にとってはデータベースがはるかに優れていると思われますが、このプログラムをデータベースに取り組むために何らかのアプローチをとるべきでしょうか?私は基本的なスタートオフやヒント/ヒントを探して、このデータベースをはるかに効率的かつより良いものにしています。すべてのルックアップが高速になるわけではありませんが、私にとっては非常に効率的ではありません。また、リストをSQLデータベースに格納するには、文字列に格納する必要がありません。

答えて

2

私はDBMSにフィルタリングとカウントを心配させたいと思っていますが、OPの提案が正規化されていない限り、テーブルのリストは問題ありません。これはDBMSの仕事を妨げるため、これは小さな問題ではありません。

また、重要なことは、トラックが再生された回数を記録することではなく、トラックが再生されるたびに記録を保持することです。違いは、保存したいものはイベントの履歴であり、イベントの概要ではないということです。このテーブル構造は、第3正規形(3NF)であるとまで書いて、照会するの両方に簡単になります

--- 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) 
); 

:あなたが欲しい

がより次のようになりテーブルです。

+0

非常に興味深い、いくつかの質問:私は同じ名前と3つの異なるアーティストと10トラックを持っている場合でも、トラックテーブルに10のエントリを作成するだろうか?これはスペースの無駄ですか?そして第二に、あなたはevent_id <-> track_idをリンクしていますが、これには何らかの理由がありますか? – wvd

+0

@wvd - event_idとtrack_isをリンクすると、「このトラックはこのイベントで再生されました」というようなものです。ポイントは何かが起こったという事実をメモすることです。あなたはそれを記録している間ではなく、事実の後に起こった何かを数えます。これは多くの理由によりずっと良いアプローチです。 10曲と3人のアーティストについてのあなたの質問については、私はあなたに従うかどうかわかりません。 3人のアーティストが10種類の曲をコラボレーションしているということですか、3つの異なるアーティストから10曲ずつ別々の曲がイベントで演奏されたということですか?あなたは一例を挙げることができますか? –

+0

私はあなたの考えを理解しています。スマートに見えます。私はテーブル[ここ](http://pastebin.com/uE2C1PtJ)にいくつかのエントリを書きましたが、唯一の問題はアーティストがトラックを制作して再生できることです。あなたの方法では、「アーティストXはトラックAを時代に演奏しました」とは決して言わない。 – wvd

0

一見したところでは、1つのテーブルにIDのリストを格納せず、もう1つのテーブルからそのテーブルへの参照を戻すという例外があります。

あなたが記述ループは「回数」を使用して、データベースによって行わ例は99%であると

データベースの「参加」はカウントで本当に良いと高速で、見上げます。

詳細なヘルプが必要な場合は、SQL文がどのように表示されるかを新しい質問にしてください。

+0

ありがとうございます。パフォーマンスがもっと良いかどうかわかりました。私はそれができると思います。 – wvd

関連する問題