2014-09-01 58 views
1

所以我有一個由我們的DBA設置的模式,現在我需要將它轉換爲SQL Azure。我在嘗試將它轉換爲我們用於Azure移動服務的.NET後端時遇到了一些麻煩。這裏的架構:如何創建嵌套的:Entity Framework中的多個關係?

Schema diagram

的這些都是一個一對多的關係。所以你會注意到有多個關聯多個表的外鍵。例如在Scenario表中,項目表和區域表有一個外鍵。這是設置數據庫的好方法嗎?難道你只是將表關聯到指向父表的指針嗎?例如在Scenarios表格中,只有SubAreas的FK?起初我想在我的Azure的服務創建EntityData類,像這樣:

public class SubArea : EntityData 
{ 
    public string SubAreaAttenuation {get; set;} 
    ... 
    ... 
    public virtual Area Area {get; set;} 

    public virtual ICollection<Scenario> Scenarios {get; set;} 
} 

我需要在分區明確鍵區和項目?或者是足夠的指針回到區域?我覺得DBA有這些額外的密鑰是有原因的(可能會讓搜索變得更容易?)但是我對數據庫的瞭解還不夠深入。

回答

1

糟糕的設計,有兩個原因:

  1. 這是一個錯誤的決定沒有任何有意義的值作爲主鍵。你的DBA應該知道,如果一個項目名稱應該改變一天,它將需要所有涉及表的表重建,因爲不能只修改一個主鍵值。

  2. 您的DBA也應該知道這是不正常的設計,因爲所有這些關鍵值都是多餘的。標準化的想法是減少冗餘。如果Area需要知道其Project的名稱,則應加入Project。 RDBMS的這些類型的後連接非常優化。

應該刪除所有這些組合鍵。主鍵應該是單數與業務邏輯無關的值,因此它們可以是不可變的(所謂的替代鍵 - 這是一個學術特權,可以考慮這些anti pattern)。用複合鍵編寫聯接是一個PIA。即使使用EF爲您生成查詢,它也更容易擁有單一的主鍵。

如果任何字段組合應該是唯一的,則應該應用唯一的索引,可能是聚集的。主鍵默認爲羣集,但在設計表時,可以選擇另一個索引作爲聚簇索引。這是contemplate profoundly

+0

關於第二點:那麼創建像上面的「SubArea」類這樣的實體類是一個好主意嗎?我在哪裏收集兒童(場景)和指向其父級(Area)的指針。然後,爲了像圖中那樣獲得層次關係,我需要創建連接? – WiteCastle 2014-09-02 00:32:55

+1

是的,那絕對是我會做的。雖然你不應該像在LINQ中編寫它們那樣「創建連接」,但是要利用你提到的導航屬性。只有在性能明顯受損的情況下,您纔可以考慮使用冗餘外鍵(單個Id​​值)到樹中較高的父級。 – 2014-09-02 06:44:03

相關問題