我已经编程了相当长的时间,但整个数据库的事情已经完全由我完成了。我现在正试图解决其中一些问题,但我正在努力解决如何建立关系的问题。
我在一家录像店工作,所以我们有大量需要用元数据标记的文件。在文件系统上,各个文件按顺序编号,并存储在由项目的ID号和包含所有元数据的csv文件组成的文件夹中。
e.g。
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列的方法,还是有更好的方法?
答案 0 :(得分:1)
你的架构对我没有意义。
一个project_folder
会涉及多个indexed
,因此您必须添加indexes.project_id
,而不是project_folder.indexed_key
。
另外,我会将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
);