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.. |

我有一个 Python 脚本,它运行并根据元数据 csv 自动标记所有单个文件。该项目试图扩大该脚本,使其不再需要被人类触及。

造型:

我想跟踪三件主要的事情:

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

但我不确定如何将所有表格“附加”到彼此。

例如,从元数据开始。我需要一个将元数据表与项目表联系起来的键。我不太确定如何做到这一点,因为元数据中的键都是唯一的并且与外部文件相关——更不用说这些键在每个项目文件夹中都是相同的,因为各个文件都是按顺序编号的。

因此,似乎解决方案只是将 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
);

但这似乎违反了我对规范化的理解,因为现在每一行都会有一条重复的信息。我在尝试附加索引表时遇到了同样的问题..

添加 project_id 列实际上是解决方法,还是有更好的方法?

4

1 回答 1

1

你的模式对我来说毫无意义。

一个project_folder会关联很多indexed,所以你必须添加一个indexes.project_id,而不是project_folder.indexed_key

另外,我会与 合并project_foldermetadata因为它们是一对一的映射。

如果您更喜欢单独的表格,我确实更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 回答