簡體   English   中英

動態表生成

[英]Dynamic Table Generation

首先,讓我描述一下我的處境,以便您可以更好地幫助我。 有兩個部分。

1:我有一個程序可以運行並分析一堆文件。 它生成一個“報告”,隨后將其輸入網站以進行數據庫存儲和查看。 該報告可以包含幾乎任何類型的數據,因為用戶可以查詢幾乎所有內容。 我離開它很開放。

2:網站通過該報告進行分析,並添加了一些常見條目。 而且還會為找到的任何新數據創建一個新表。 它還存儲從report_id到所有這些動態創建的表的映射。 例如,如果某人想要在報告中計算標准偏差,並且對於該報告來說這很有意義,那么將沒有STD表。

現在,該站點是用PHP編寫的,看起來有些混亂。 有沒有更好的方法來執行此PHP。 另外,由於組織的緣故,我正在考慮在Rails中對其進行重做。 在rails中是否有更好的方法“ method_missing?”。

我不太擅長建立網站,也不太熟悉DB,所以請客氣。

謝謝埃里克

看起來您具有非結構化數據,或者最好是具有半結構化數據。 除非您使用XML作為存儲,否則經典的關系數據庫表不是理想的選擇。 您可以考慮提出一種中間的報表定義語言 ,然后將其存儲在數據庫中,通常為XML。 MS SQL服務器,Oracle和DB2支持XML數據的存儲和查詢。

經過一番思考..
您還可以研究觀察模式 ,看看是否可以使其適應本示例。 盡管該模式是OO,但可以在SQL中完成。
這是一個很長的解釋,但是我在這里發布了一個簡化的模型 希望您覺得這個有幫助。

observation_model_01

在運行時修改數據庫的結構非常危險。 我建議將未知或新遇到的信息存儲在“混合”類型表中,您也可以在其中給信息添加“標簽”以識別它。 如果遇到新的信息類型(例如標准差),則可以創建一個新標簽(有點像文件擴展名),然后將信息與關聯的標簽一起添加到信息表中。 如果創建新表,則更改架構,因此更改數據庫的使用規則。

如果表數量太多,自動創建表可能會讓您頭疼。 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.

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