iT邦幫忙

0

有辦法將 MySQL 內部同 DB 的 table 自動 Merge 成一張總表嗎?

各位大大好

想請教一個DB問題
目前小弟遇到的狀況是,我有一堆爬蟲在爬資料,他們分別會將爬到的資料寫入不同的 table 中,但是因為網站端基於希望 query 方便的理由,想讓所有 table 都變成一張總表,這樣他們只要針對單一 table 的 ID 去做 filter 就好。

因此我想問的是,有沒有辦法可以自動產生一張總表,當我的爬蟲各自寫入各自的 table 時,讓 MySQL 內部自動去對總表做刪減,就是說,這張總表會永遠顯示所有 table 的集合?

huahualiu iT邦新手 5 級 ‧ 2020-07-15 11:06:32 檢舉
補充一下,這張總表,希望也是一個 table 的形式被自動生成在同一個 DB 中

會這樣分開又合併主要是考慮到:
1. 爬蟲的資料欄位 未來可能有變動可能,因此分開 table 存取,對於管理以及擴充彈性我覺得比較大
2. 如果所有資料一開始就存進同一個table,我很擔心會不會塞車導致存入速度過慢的可能這是我的猜測,不知道實際會不會這樣發生,希望有大大了解的可以協助解答。
3
暐翰
iT邦大師 1 級 ‧ 2020-07-15 11:13:43
最佳解答

可以建立view並使用 uion 假如確定資料不會重複使用 union all,如下

--建立view
select * from table1
union all
select * from table2
union all
select * from table3
  1. 爬蟲的資料欄位 未來可能有變動可能,因此分開 table 存取,對於管理以及擴充彈性我覺得比較大

回答 : 個人在沒有千萬筆資料情況,不會做分表動作,因為管理複雜度會增加CP不高,僅提供參考

  1. 如果所有資料一開始就存進同一個table,我很擔心會不會塞車導致存入速度過慢的可能這是我的猜測,不知道實際會不會這樣發生,希望有大大了解的可以協助解答。

回答 : 影響很小,在沒有大數據情況,我不會擔心

看更多先前的回應...收起先前的回應...

別自找麻煩,別聽一些"架構師"講什麼"分庫分表".

暐翰 iT邦大師 1 級 ‧ 2020-07-15 11:28:47 檢舉

對,跟大大想法一樣

我很擔心會不會塞車導致存入速度過慢的可能 <-- 如果你寫的程式跑超快(C++ / Rust / Golang currency),對方網站回應也超快,網路也超快,延遲很低,反應比SSD寫入速度快,那就多買幾顆SSD,讓Disk Array 整體速度更快.資料庫分表,還不是用同一個儲存引擎,然後往Disk Array 丟.

huahualiu iT邦新手 5 級 ‧ 2020-07-15 11:59:56 檢舉

了解了 謝謝大大

1
浩瀚星空
iT邦超人 1 級 ‧ 2020-07-15 11:38:38
  1. 爬蟲的資料欄位 未來可能有變動可能,因此分開 table 存取,對於管理以及擴充彈性我覺得比較大

基本這樣的方式,我會區分主表+對應表。當然,主表主要是為了統一化的數值。
但如果統一化的數值根本就沒有的情況下。就不建議這樣子做
這時候 暐翰 的做法,反而比較好。
先各別去處理各別的資料,再用view來統整資料。

  1. 如果所有資料一開始就存進同一個table,我很擔心會不會塞車導致存入速度過慢的可能這是我的猜測,不知道實際會不會這樣發生,希望有大大了解的可以協助解答。

這其實就是我上面說的,如果你能用一個主表來建立所有爬蟲的共用值。再生成對應表來各別建立。
這樣也是一種方式。只是這樣關聯跟sql的語法要設定好就是了。比較偏向專庫管理的知識。
且在考量上也需要決定是否有其必要性。
因為這樣的規劃很麻煩。要考量一下必要性。

2
japhenchen
iT邦研究生 1 級 ‧ 2020-07-15 11:49:51

有些架構師就是教你一個案子/項目建一個(堆)分表TABLE(S)

比如現在有3個專案,分別是A2020005 A2020006 A2020007
那資料庫裡弄出了
MAIN_A2020005 DETAIL_A2020005 JOB_A2020005
MAIN_A2020006 DETAIL_A2020006 JOB_A2020006
..........
過了幾年後出現了成千上萬的表TABLES.........我保証你以後會整理到瘋掉!如果是在WINDOWS裡有個資料夾弄出了成千上萬個檔案,這個資料夾還會非常容易損壞

我還是喜歡資料庫建立時有20個表,經過十年還是20個表,表裡用專案編號做PK即可
沒事真的別分表,沒有比較好!

但如果樓主執意要用分表的方式,那請再多用一個表來儲存分表關鍵名,再做VIEW拉總表,VIEW裡就先抓分表名的TABLE抓所有附加的TABLE,再去JOIN出總表來

0
kikulu
iT邦研究生 4 級 ‧ 2020-07-15 17:09:13

寫入時根據filter另外寫進供查詢的表
或是每天排程根據query需求進行表的彙整資料
寫進另外一個database

我要發表回答

立即登入回答