[英]Dynamic Table Generation
首先,讓我描述一下我的處境,以便您可以更好地幫助我。 有兩個部分。
1:我有一個程序可以運行並分析一堆文件。 它生成一個“報告”,隨后將其輸入網站以進行數據庫存儲和查看。 該報告可以包含幾乎任何類型的數據,因為用戶可以查詢幾乎所有內容。 我離開它很開放。
2:網站通過該報告進行分析,並添加了一些常見條目。 而且還會為找到的任何新數據創建一個新表。 它還存儲從report_id到所有這些動態創建的表的映射。 例如,如果某人想要在報告中計算標准偏差,並且對於該報告來說這很有意義,那么將沒有STD表。
現在,該站點是用PHP編寫的,看起來有些混亂。 有沒有更好的方法來執行此PHP。 另外,由於組織的緣故,我正在考慮在Rails中對其進行重做。 在rails中是否有更好的方法“ method_missing?”。
我不太擅長建立網站,也不太熟悉DB,所以請客氣。
謝謝埃里克
在運行時修改數據庫的結構非常危險。 我建議將未知或新遇到的信息存儲在“混合”類型表中,您也可以在其中給信息添加“標簽”以識別它。 如果遇到新的信息類型(例如標准差),則可以創建一個新標簽(有點像文件擴展名),然后將信息與關聯的標簽一起添加到信息表中。 如果創建新表,則更改架構,因此更改數據庫的使用規則。
如果表數量太多,自動創建表可能會讓您頭疼。 ext3中目錄項超過5000的目錄列表開始顯得很昂貴,當您獲得100,000多個文件時,肯定會非常耗時。 (mysql CLI在連接時將嘗試緩存所有表名,要跳過該表名,您需要使用-A開關進行連接。)
您可能會考慮使用臨時表來創建報告,然后可能將結果精簡為報告字符串,以便以后檢索。 或者,正如JP所提到的,一個表結構在同一表中標記值和報告:
create table stddev (
report_id int(11),
field_name int(11), -- fk to field
field_value double
);
create table reports (
report_id int(11);
report_name varchar(255);
);
為了僅獲取一個報告的數據,您可以選擇指定report_id進行選擇:
select * from stddev where report_id = 123;
我將為您的報告名稱,字段名稱創建表,並且您可能希望將輸入值與為報告保存的派生/計算值區分開。
根據您輸入新數據的頻率,我不會過早地從幾個大表到很多小表進行優化。 正確索引后,大表可以很好地執行。
但是,此應用程序正在處理的數據量是多少? 首先有使用許多小表的原因嗎?
我使用PHP處理大量數據。 如果您的模式有意義,那么它也使PHP代碼更有意義。 如果是我,我不會切換到其他編程語言,直到我遇到該語言的實際結構限制之前,我都會堅持我的開始。 對我來說,改用Rails會浪費時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.