2013-02-18 32 views
0

我正在爲一個新項目設計一個MySQL數據庫。我將每天導入50-60 MB的數據。將新數據導入到主數據庫與臨時數據庫?

將會有一個帶有主鍵的主表。然後將會有子表和他們自己的主鍵以及一個指向主表的外鍵。

新數據必須從巨大的文本文件中解析出來,然後在導入到主數據庫之前進行一些小的操作。解析和導入操作可能涉及大量的故障排除,因此我想將新數據導入臨時數據庫並在添加到主數據庫之前確保其完整性。

由於這個原因,我以爲每天最初都會解析和導入新的數據到一個單獨的臨時數據庫中。通過這種方式,我可以在添加到主數據庫之前檢查數據,同時我將每天的數據作爲單獨的數據庫存儲,以後我需要從各個臨時數據庫重建主數據庫。

我正在考慮在InnoDB引擎中使用主鍵/外鍵來維護表間的關係完整性。這意味着當我每天導入新數據時,我必須擔心自動增量ID(主鍵)沒有任何重複。

那麼,鑑於這種情況,最好是什麼?

  1. 製作母版的副本,並直接導入到母版的副本中。將現有主版本替換爲新副本。

  2. 每天將新數據導入臨時數據庫,但將主鍵的自動遞增起始值更改爲大於主服務器中的最大值。我是否也會爲所有表(主表及其子表)的主鍵更改自動增量值?

  3. 每天將新數據導入臨時數據庫,而不用擔心主鍵值。找到一些其他的方式來合併臨時數據庫和主數據庫,而不會碰到主鍵?如果使用這種策略,我怎樣才能在主表中更新新數據的主鍵,同時確保與子表的所有關係都保持正確?

+0

爲什麼不能在導入數據時檢查數據?使用事務並在所有內容都看起來不錯時進行提交,或者如果要中止則回滾。以較小的塊導入,您可以驗證,因此如果某些內容沒有檢出,則不必中止整個過程。 – 2013-02-18 23:14:12

+0

IMO列出的所有三條建議都太複雜 - 太多的方法讓它們斷裂。 – 2013-02-18 23:15:22

+0

@Gavin,但你是不是說我應該在第一次發表評論(你爲什麼不能在導入數據時檢查數據)?有一件事是,我必須導入新的數據並在在線發佈之前在本地環境中進行測試。所以我必須在數據庫的副本下離線執行此操作......然後我只想將新數據導入在線主服務器,而不是每天上傳主服務器。每天有50-60 MB的新數據,數據庫會很快變大......然後我必須每天將這個龐大的數據庫上傳到服務器。這將是很多帶寬。 – iakkam 2013-02-18 23:21:16

回答

0

我不確定這是否如您所做的那樣複雜?

爲什麼不只是這樣做:

  1. 導入原始數據到臨時表(爲什麼它必須是一個獨立的數據庫?)
  2. 臨時表上運行您的變換/完整性檢查。
  3. 當數據良好時,將其直接插入主表中。
  4. 根據您導入的數據,在主表上使用自動遞增ID爲而不是。這允許你有一個唯一的ID 原來的ID可能已經存在於你的導入。
  5. 將一個字段添加到您的主表中,以便爲您提供記錄來自哪個導入的記錄。
  6. 除了將數據複製到主表中之外,還要創建一個記錄,以便與您合併的數據相關聯。如果發現錯誤/不良,並幫助您審覈跟蹤,可幫助您退出數據。

最後只需建立一個沙箱數據庫,寫一堆存儲過程並測試一下垃圾。 =)

+0

我認爲您可以將新數據導入到臨時表中,儘管我可能有12個左右的表,因此我將不得不創建所有這些表的臨時版本。但是,如何維護子表和父表之間的關係呢?當我從臨時父表插入到主父表中時,我還必須擔心將新主鍵與子表匹配......我如何將臨時表(父+子)中的所有內容複製到主表(父母+孩子),同時保持關係的完整性? – iakkam 2013-02-18 23:30:14

+0

爲了澄清......您正在導入一張內含關係的大表格?或導入許多文件? – ryan1234 2013-02-19 02:41:06

+0

我會導入大約十幾張表。一個表是父表,其他表是子表...每個子表都有一個指向父表的外鍵。 – iakkam 2013-02-19 03:59:13