我已经编程了很长时间,但是整个数据库的事情已经完全被我忽略了。我现在正在尝试解决其中的一些问题,但我正在为如何建立关系而苦苦挣扎。
目的:
我在一家摄像店工作,所以我们有大量需要用元数据标记的文件。在文件系统上,各个文件按顺序编号,并存储在由项目 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 自动标记所有单个文件。该项目试图扩大该脚本,使其不再需要被人类触及。
造型:
我想跟踪三件主要的事情:
- 每个文件夹中的元数据
- 标记了哪些文件以及何时标记的日志
- 脚本当前正在监视的所有文件夹的列表。
如果我将其存储为 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 列实际上是解决方法,还是有更好的方法?