2

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

我正在做的是将关键字与文本文件碰撞以找到关键字出现的行,并且可以多次这样做。所以我想ID (text file name without .txt), Extracted_Data, Line_Number, Spwaned_Across (keyword may be spread across 2 lines)为每次出现存储。

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

表:abc、xyz、klm

表 abc 样本数据:

ID Extracted_Data                         Line_Number Spawned_Across
12 MySQL is wonderful. What is 'abc'      34          1

所以我最终为每个关键字制作了一个表格。在我的项目中,大约有 150 个关键字,并且可以增长。所以150张桌子。

为什么我选择这样做?

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

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

4

4 回答 4

6

不要那样做。没有数据库库针对动态表名进行了优化,每次要访问表时,您最终都必须从头开始创建查询。另外,您将如何回答诸如“我在文件 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 和其他相关数据插入location.

回答我之前提出的问题:

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 的语法是相似的,但我不记得了,你可以很容易地找出差异。

于 2011-08-02T15:21:52.380 回答
5

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

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

因此,您必须通过关键字或文件或两者来查询,所有数据都存在。为了进一步规范化,您可以将关键字单独存储在“keywords”表中,并仅将外键保留在“occurrences”表中。

此外,除了主键之外,将“ID”命名为任何名称也不是很流行。

于 2011-08-02T15:02:36.313 回答
2

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

数百万行优于数百万表。

使用合适的外键创建 2 个表,你会没事的。

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

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

于 2011-08-02T14:57:43.183 回答
1

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

新的关键字将意味着更多的表格。那是不可扩展的。

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

于 2011-08-02T15:03:33.833 回答