Python 这是一个高效的MySQL数据库设计吗?

Python 这是一个高效的MySQL数据库设计吗?,python,mysql,database-design,memory-efficient,Python,Mysql,Database Design,Memory Efficient,我正在从事一个项目,其中我有一组关键字[abc、xyz、klm]`。我还有一堆文本文件,内容为[1.txt,2.txt,3.txt] 我正在做的是将关键字与文本文件碰撞,以找到关键字出现的行,它可以多次这样做。因此,我想为每次出现存储ID(不带.txt的文本文件名)、提取的数据、行号、Spwaned\u(关键字可能分布在两行上) 我决定为每个关键字创建一个表来存储这些数据 表:abc、xyz、荷航 表abc样本数据: ID Extracted_Data

我正在从事一个项目,其中我有一组关键字[abc、xyz、klm]`。我还有一堆文本文件,内容为[1.txt,2.txt,3.txt]

我正在做的是将关键字与文本文件碰撞,以找到关键字出现的行,它可以多次这样做。因此,我想为每次出现存储
ID(不带.txt的文本文件名)、提取的数据、行号、Spwaned\u(关键字可能分布在两行上)

我决定为每个关键字创建一个表来存储这些数据

表:abc、xyz、荷航

表abc样本数据:

ID Extracted_Data                         Line_Number Spawned_Across
12 MySQL is wonderful. What is 'abc'      34          1
因此,我最终为每个关键字创建了一个表。在我的项目中,大约有150个关键字,而且可以增长。150张桌子

我为什么选择这样做?

目前,我需要找出关键字是否存在于文件中,我确信将来我会被要求显示关键字在文件中出现的位置或方式。我计划为每个新关键字自动创建一个表,这样我就不必手动创建每个关键字或一个包含100列的巨大表


我做了正确的决定吗?非常感谢您的意见。

这绝对是一个非常糟糕的决定

数以百万计的行比数以百万计的表好

用合适的外键创建两个表,这样就可以了

我将被要求在文件中显示它发生的位置或方式


这仍然可以在两个表中完成

我不明白为什么不能将关键字与数据一起存储在一个表中

ID  Keyword  Extracted_Data  Line_Number Spawned_Across
12  abc      Abc or xyz?..   31337       1
12  xyz      Abc or xyz?..   31337       1
12  xyz      just xyz here   66666       1
13  xyz      xyz travels!    123         1
因此,您必须按关键字或文件进行查询,或同时按两者进行查询,所有数据都存在。要进一步规范化,您可以在“关键字”表中单独存储关键字,并在“occurences”表中仅保留外键


此外,除了主键之外,给“ID”命名也不是很流行。

我认为这不是很有效。我甚至不确定关系数据库是否适合这项工作

新的关键字将意味着更多的表。这是不可伸缩的


关键字和文件让我想到了索引和非结构化搜索。在使用关系数据库之前,我会先考虑Lucene。

不要这样做。没有针对动态表名优化的数据库库,每次访问表时都必须从头开始创建查询。另外,您如何回答“我在文件12的第34行中找到了哪些数据”之类的问题

你要三张桌子。在PostgreSQL语法[*]中,应该是:

CREATE TABLE source (sourceid SERIAL, filename VARCHAR NOT NULL);
CREATE TABLE keyword (keywordid SERIAL, keyword VARCHAR NOT NULL);
CREATE TABLE location (locationid SERIAL,
    sourceid INTEGER NOT NULL REFERENCES source(sourceid),
    keyword INTEGER NOT NULL REFERENCES keyword(keywordid),
    data VARCHAR NOT NULL,
    line INTEGER NOT NULL,
    span INTEGER NOT NULL);
开始处理新文本文件时,请创建一个新的
source
元组并记住其sourceid。遇到关键字时,请为其插入新记录并记住其关键字ID,或者查找旧记录。然后将sourceid、keywordid和其他相关数据插入
位置

回答我先前提出的问题:

SELECT * FROM
    location JOIN source ON location.sourceid = source.sourceid
    JOIN keyword ON location.keywordid = keyword.keywordid
WHERE
    source.filename = 'foo.txt' AND
    location.line = 34;
是的,用“正确”的方式做这件事需要更多的前期工作,但在性能、易维护性和易使用性方面,您将获得百万倍的回报


[*]MySQL语法将是类似的,但我记不得了,你可以很容易地找出区别。

我尝试了整个solr/Lucene大约一周,但无法根据我的情况调整模式。如果我为所有文档编制索引,您认为solr是否可以吐出关键字,为每个文件提取匹配行(多次)?我开始探索,我发现它是一只野兽,驯服它需要很多时间!