基本数据库设计:努力将字典思维映射到关系思维。如何对这些数据进行建模?

时间:2013-10-31 03:14:07

标签: mysql sql database sqlite

我已经编程了相当长的时间,但整个数据库的事情已经完全由我完成了。我现在正试图解决其中一些问题,但我正在努力解决如何建立关系的问题。

目的:

我在一家录像店工作,所以我们有大量需要用元数据标记的文件。在文件系统上,各个文件按顺序编号,并存储在由项目的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自动标记所有单个文件。该项目试图扩展该脚本,以便不再需要人类触及它。

建模:

我想跟踪三件主要内容:

  1. 每个文件夹中的元数据
  2. 已标记文件的日志以及何时
  3. 脚本当前正在监视的所有文件夹的列表。
  4. 如果我将它存储为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列的方法,还是有更好的方法?

1 个答案:

答案 0 :(得分: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
);