[英]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.