簡體   English   中英

這是一個高效的MySQL數據庫設計嗎?

[英]Is this an efficient MySQL database design?

我正在開發一個項目,其中我有一組關鍵字[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列的巨型表。

我做出了正確的決定嗎? 您的意見非常感謝。

不要那樣做。 沒有針對動態表名優化數據庫庫,並且每次要訪問表時,最終都必須從頭開始創建查詢。 另外,您如何回答“我在文件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語法將類似,但我不記得它,你可以很容易地找出差異。

我不明白為什么你不能只將關鍵字沿着數據存儲在一個表中。

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”表中,並僅將外鍵保留在“occurences”表中。

除了主鍵之外,將“ID”命名為“ID”也不是很受歡迎。

這絕對是一個非常糟糕的決定

數百萬行比數百萬個表更好。

使用合適的外鍵創建2個表,你會沒事的。

我將被要求顯示文件中的位置或方式。

這仍然可以在2個表中完成

我不認為這是有效的。 我甚至不確定關系數據庫是否適合這項工作。

新關鍵字意味着更多表格。 這不可擴展。

關鍵字和文件讓我想到了索引和非結構化搜索。 我會在關系數據庫之前考慮Lucene。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM