2017-06-23 52 views
-1

我有一個基本的個人項目網站,我期望學習一些Web開發基礎和數據庫(SQL)基礎知識(如果SQL甚至是正確的技術使用??)。燒瓶網站後臺結構指導援助?

我的基本框架已經啓動並正在運行,但由於我是新手,我想確保以最高效和「正確」的方式執行此操作。

目前該網站有一個主索引(登陸)頁面,從那裏用戶可以選擇幾個子頁面中的一個。爲了理解,這些子頁面中的每一個表示不同的衝浪休息,並且它們各自顯示關於該特定休息的相關信息,即波高,風,潮。

由於我已經能夠成功地抓取這些數據,我的主要問題圍繞着如何將這些數據插入數據庫以供將來使用(歷史圖表,趨勢)展開?我如何確保以連續的方式(每天一次)將數據添加到此數據庫?我如何使用早些時候被刮掉的數據,比如中午說,在12:05 PM顯示/使用,而不是再次刮掉它?

任何其他提示,指導或資源,你可以指向我非常感謝。

回答

1

這種數據被稱爲時間系列。對於時間序列,有專門的數據庫引擎,但是具有非極端數量的觀測數據(時間戳,波高,風,潮,這是破壞它的元組) - 一個SQL數據庫將會非常好。

嘗試在Postgres或MySQL中將數據建模爲表格。首先製作一個表格並手動在數據庫的GUI客戶端中插入一些假數據。當它看起來正確時,你有架構。相應的CREATE TABLE語句是您的DDL。您應該能夠對您的表編寫SELECT查詢,以產生您想要在Web應用程序上顯示的數據。如果這些查詢很尷尬,則表示您的模式需要修訂。保存你的DDL。它是(某種)你的源代碼的一部分。我想象兩張桌子:衝浪休息的列表,以及觀察列表。觀察列表中的每一行都會引用衝浪休息的列表。如果你使用的是Mac,Sequel Pro是一款適合使用MySQL數據庫的體面工具,並且玩耍可能是學習使用它的最佳方式。

接下來,嘗試從Python腳本向表中插入數據。從假數據開始就沒有問題,但是模擬你的Python腳本來從你的上游源讀取(刮取的結果)並插入到表中。你的刮碼輸出是什麼?這是一個你可以打電話的功能嗎?您可以閱讀的CSV?這將決定這個腳本的工作方式。

如果這個導入腳本是idempotent它會有所幫助:你可以多次運行它,並且不會因插入重複行而造成混亂。如果這是遞增,它也會有所幫助:一旦數據集變大,重新計算整個事情將會非常昂貴。嘗試處理一次導入特定的時間間隔。命令行工具很好。您可以將間隔指定爲命令行參數,或從當前時間中指出。從一個系統

這裏的一般問題,將數據加載到另一個上定期,被稱爲ETL。你有一個非常簡單的例子,可以使用非常簡單的工具,但如果你想了解它,那就是它的名字。相反,如果您可以獲得連續的觀測數據 - 比如直接來自傳感器 - 您將會有一個流式攝入問題問題。

您可以使用Linux子系統cron使該腳本按計劃運行。你會想知道它是否成功運行 - 這會打開一整套關於監視和警報的蠕蟲。有各種開源系統可以讓你從程序中發佈指標,基本上是「嘿,這發生了」滴答聲,看到這些指標繪製在圖表上,並要求通過電子郵件發送/發短信/分頁,如果出現頻繁發生或很少。 (順便說一句,這些系統是時間序列數據庫的主要應用之一)。不要陷入這種前沿,但要牢記在心。 Statsd,Grafana和Prometheus是一些讓你開始在這個方向上搜索的名字。您也可以簡單地讓腳本發送成功或失敗的電子郵件,但人們往往開始忽略此類電子郵件。

您將編寫一些函數與數據庫引擎進行交互。在Python模塊中提取它們。這構成了您的數據訪問層的基礎。在Flask應用程序中重用它。如果你將所有這些東西保存在同一個Git倉庫中,這將是最簡單的。您可以直接使用您選擇的數據庫引擎的Python客戶端,也可以使用SQLAlchemy之類的抽象層。這個決定是有爭議的,人們會有意見,但只選一個。無論您選擇哪種數據庫API,請了解SQL注入攻擊是什麼以及如何在查詢中使用用戶提供的數據,而無需打開自己的SQL注入。你的數據庫API的文檔應該涵蓋後者。

Flask應用程序的/頁面將基於SQL查詢,如SELECT * FROM surf_breaks。呈現每個鏈接到特定於中斷的頁面。

您將會擁有另一個頁面,如/breaks/n,其中n標識了一個衝浪休息時間(一個隨着插入衝浪休息行而增加的整數是慣用的)。本頁面將基於SELECT * FROM observations WHERE surf_break_id = n這樣的查詢。在每種情況下,您都會在數據訪問層調用函數來獲取行列表,然後在模板中遍歷這些行並呈現一些HTML。有各種Javascript和Python圖形庫,您可以將這些行列表提供給客戶端或服務器端,並從中獲取圖形。如果您對像周而復始的更改感興趣,則應該能夠在一個SQL查詢中表達這一點,並直接從數據庫引擎中獲取該數據集。

爲了提高性能,請儘量避免在頁面加載期間發生多個SQL查詢的情況。默認情況下,您將回到數據庫並在每次有人請求時重新計算頁面,從而做一些不必要的工作。如果這成爲問題,您可以在Flask應用程序前添加一個反向代理緩存。在你的情況下,這很容易,因爲沒有用戶對應用程序做任何事情導致其內容改變。導入新數據時只需使緩存無效。

+0

這是一個經過深思熟慮,全面且令人驚歎的答案。謝謝你closeparen。 –