0

私はかなりの時間プログラミングを行ってきましたが、データベース全体が完全に私から抜け落ちました。私は今、これのいくつかを拾おうとしていますが、関係を設定する方法に苦労しています.

目的:

私はビデオショップで働いているので、メタデータでタグ付けする必要があるファイルがたくさんあります。ファイル システムでは、個々のファイルに順番に番号が付けられ、プロジェクトの ID 番号とすべてのメタデータを含む csv ファイルで構成されるフォルダーに保存されます。

例えば

Projects/ 
   |
   | - Project_ID_4539485/
              | - metatdata.csv
              | - Rec_01.mp4
              | - Rec_02.mp4
              | - ...
              | - Rec_N.mp4
   | - Project_ID_4539485/
            etc...

次のように、メタデータを csv ファイルに保存します。

| filename | Title | Album | Artist | etc.. |

そのメタデータ csv に基づいて、すべての個々のファイルを実行し、自動的にタグ付けする Python スクリプトがあります。このプロジェクトは、そのスクリプトをスケールアップして、人間が触れる必要がないようにする試みです。

モデリング:

押さえておきたいポイントは主に以下の3つです。

  1. 各フォルダのメタデータ
  2. どのファイルがいつタグ付けされたかのログ
  3. スクリプトによって現在監視されているすべてのフォルダーのリスト。

これを JSON として保存する場合、そのようなネストされた辞書の方法で考えるのは比較的簡単ですが、それをリレーショナルなものに変換しようとすると壊れてしまいます。

辞書とリストの混乱として、次のように設定します。

watch_folders = {
    'Project_ID_4539485' : {
        'metadata' : {'Title' : 'bla', 'artist' : 'foo', etc..},
        'indexed' : [[filename, checksum, last_modified], 
                     [filename, checksum, last_modified],
                     etc..]
        },
    'Project_ID_4539682' : {
        'metadata' : {'Title' : 'bla', 'artist' : 'foo', etc..},
        'indexed' : [[filename, checksum, last_modified], 
                     [filename, checksum, last_modified],
                     etc..]
        },
    # and so on... 
}

翻訳しようとすると、次のようになります。

create table metadata (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    filename INTEGER, 
    title TEXT, 
    artist TEXT,
    album TEXT, 
    year TEXT,
    genre TEXT, 
    publisher TEXT, 
    url TEXT
);

create table indexed (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    filename TEXT, 
    checksum TEXT,
    date_modified TEXT
);

create table project_folder (
    project_id INTEGER PRIMARY KEY, 
    metadata_key INTEGER, 
    indexed_key INTEGER
);

しかし、すべてのテーブルを互いに「接続」する方法がわかりません。

たとえば、メタデータから始めます。メタデータ テーブルをプロジェクト テーブルに結び付けるキーが 1 つ必要です。メタデータのキーはすべて一意であり、外部ファイルに関連しているため、その方法がよくわかりません。言うまでもなく、個々のファイルにはすべて順番に番号が付けられているため、これらのキーは各プロジェクト フォルダーで同じになります。

したがって、解決策は project_id フィールドをメタデータ テーブルに追加するだけのようです。

create table metadata (

    project_id PRIMARY KEY,
    filename INTEGER, 
    title TEXT, 
    artist TEXT,
    album TEXT, 
    year TEXT,
    genre TEXT, 
    publisher TEXT, 
    url TEXT
);

しかし、これは正規化について私が理解していることに違反しているようです。現在、すべての行に1つの繰り返し情報が含まれているためです。インデックス付きテーブルをアタッチしようとすると、同じ問題が発生します..

実際に project_id 列を追加する方法はありますか、それともより良い方法がありますか?

4

1 に答える 1

1

あなたのスキーマは私には意味がありません。

1 つproject_folderは多くの を関連付けるので、ではなくindexeda を追加する必要があります。indexes.project_idproject_folder.indexed_key

また、 1 対 1 でマッピングされるため、とマージproject_folderします。metadata

別々のテーブルを好む場合は、metadata.project_idむしろproject_folder.metadata_key.

についてproject_folder.filename、なぜそれが使用されているのかわかりません!

したがって、私の提案は次のようになります。

create table project_metadata (
    project_id INTEGER PRIMARY KEY, 
    filename INTEGER, -- ???
    title TEXT, 
    artist TEXT,
    album TEXT, 
    year TEXT,
    genre TEXT, 
    publisher TEXT, 
    url TEXT
);

create table indexed (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    project_id INTEGER REFERENCES folder_metadata.project_id,
    filename TEXT, 
    checksum TEXT,
    date_modified TEXT
);
于 2013-10-31T09:44:06.953 に答える