4

我正在將舊數據庫系統升級到.NET +實體框架6(代碼優先POCO)+ PostgreSQL。爲了便於編程,我要拆分大型表(超過200場)劃分爲多個實體,如:EF6表拆分vs多個拆分的共享主鍵

Franchise 
FranchiseLegalEntity 
FranchiseBilling 
FranchiseSignup 
FranchiseAllocation 
FranchiseCompliance 
FranchiseMiscellaneous 
FranchiseNotifications 

我很高興地發現EF6支持「表分裂」:映射一個表到多個實體分割領域。

然而,試圖實現這一點,並在線閱讀很多頁面時,確認這在分割多次時是有問題的。實體框架不僅需要主體實體的導航屬性,還需要映射到該表的所有實體之間的導航屬性。對於我上面的場景,這需要21個無意義的導航屬性 - 如果我打擾他們使用雙向導航屬性,則需要42個導航屬性。

參見:http://social.msdn.microsoft.com/Forums/en-US/0f65caae-8a66-431f-aa02-4b2c68f871e9/ef-41-rc-code-first-split-one-table-into-multiple-entities?forum=adodotnetentityframework

參見:How to separate large table into multiple discrete types using EF-Code-First

使用具有共享主鍵的多個表建議,一個是我的選擇。然而,考慮到EF的臃腫的SQL查詢生成以及PostgreSQL有時候具有複雜查詢的隨意查詢優化器,我擔心這個選項(100GB +數據庫)的性能。

總結:

表拆分

優點:最佳的查詢性能,最快在數據庫層

缺點來實現:污染的我的模特和OnModelBuilding()方法廢話,混淆其他開發商

跨多個表個共享主鍵

優點:最乾淨的車型&代碼,對於非傳統的數據庫推薦的解決方案

缺點:額外的工作來實現,可能表現較差

我的問題:

1)EF6是否改善了2+分裂的表分裂?

2)有沒有我沒有考慮過的因素?

3)有沒有其他的選擇?

P.S.我對使用[ComplexType]不感興趣使用[ComplexType]

+0

也許你應該考慮使用視圖和創建視圖的實體?優點 - 簡單 - 缺點 - 不參考。另外考慮到一旦數據庫已經創建並且事情進一步改變,管理表分割會遇到困難。 –

回答

1

我已經解決的解決方案是表分割選項。

這涉及到添加很多無意義的導航屬性到我的模型和依賴流利的API。我認爲這是兩個惡意中較小的一個,因爲它們造成的開銷很小,並且避免了潛在的性能問題。

我列出詳細(包括代碼)的解決方案,在這個線程:

EF6 failing to build model for Table Split/Shared Primary Key + Base class?

1

有很多假設,您可以嘗試BCP輸出必要的字段子集和BCP-將它們返回到所需的數據庫表。這是一個簡單且可重複的過程,因爲BCP-out SQL語句在您的控制之中,因此您始終只能導出部分數據(例如,僅限於某個日期之後創建的記錄)。但是,由於數據量很大,它可能不適合你。