1

使用能夠生成代碼的數據庫建模工具時,存在某些關係類型(幾乎不支持)。它們包括1對1,多對多和0或1比0或1:1,和0..1:0..1。零或一對零或一個關係問題

前兩個有簡單的解決方案。 1或1:1:0..1

  1. 1對1能夠通過轉換爲0..1對1或1對0..1,0..1來解決。

  2. 多對一許多可以通過在關係的中間使用一個表,然後可以解決任一1:*和一個:1或0..1:和*:0 .. 1或一些類似的組合。我認爲有四種可能的組合解決它。

但是,我卡在0..1到0..1。事實上,我有這樣一組似乎具有這種邏輯關係的表格。

在我的情況下,我有四個表。爲了論證,假設它們都具有INT類型的主鍵。這些表格是人員,組織,客戶和員工。

關於邏輯的一句話。組織可以有人,他們在關係中被稱爲聯繫人。員工既可以是客戶也可以是員工,或者兩者兼而有之。

參與組織< - > has Contacts < - > as People。這是一個0..1:*的關係。這意味着一個人可以有或沒有一個組織,並且一個組織可以有很多人(或沒有)。

員工必須擁有人員記錄,而且這種關係也是有意義的。這是一個0..1:1的關係,員工必須有一個人,但一個人可以有0或1個員工記錄。

但是這個沒有意義,因爲實體繼承在邏輯上在雙向流動。以人員或組織爲例。客戶既可以是組織也可以是人員,但不能同時擁有,並且通過類型標誌字段進行選擇。同樣的一個人不一定是一個客戶,以後可能是一個員工或其他聯繫方式。我不能要求某人成爲客戶,我不能要求客戶成爲一個人。同樣,我不能要求組織成爲客戶,我不能要求客戶成爲組織。所以繼承的分離也是必要的。在Customer:Person和Customer:Organization的情況下,它們都需要實現0..1:0..1和0..1:0..1。但是語言工具不支持它。因爲它們是強類型語言,所以實體繼承只能以單一方向流動。即使是弱類型的語言,你仍然會在首先出現的情況下出現:雞或雞蛋。

JavaScript可能非常適合這種情況,因爲您可以動態更改對象類型的結構,並且即使無法顯式聲明對象以存在於此中方式。

但我今天的工具是Microsoft LightSwitch,它根本不會這樣做。我不認爲現代建模工具的存在將會產生強類型的語言代碼,這將允許這種關係類型。

是否有一個技巧可以克服這種關係,0..1:0..1,還是有一些基本的東西我還沒有明白?我留在這裏選擇一邊,我不知道哪一方獲勝:客戶或個人,客戶或組織。但是,也許還有其他事情我可以做,而不會影響任何一種情況。有沒有關於破碎的模型的東西?

謝謝!

回答

0

0..1模型通常是一個is-a關係。這映射到C#中的繼承。在C#中,您不能創建從多個其他類繼承的類(僅通過接口)

您的模型純粹建模爲關係數據庫,但它不映射到沒有多重繼承的對象結構。在C#中定義一個模型(使用繼承和關係),然後爲其生成一個Datamodel,因爲在這種情況下,C#是限制因素。

記住,你可以使用繼承:

Customer 
<--is-a- Corporate Customer --has-a-- Organization --has-many-| 
<--is-a- Natural Customer --has-a-- Person <--is-a- Employee 

在這種情況下,你將不能夠直接投下Customer一個人或一個組織,但你可以得到被鏈接到記錄這個班對我來說很自然。但員工總是一個人(這是有道理的)。

如果你想要繼承OrganizationPersonLegalEntity。無論是在上述模型(保留Natural/Corporate Customer),

Customer<T:LegalEntity> -----------has-a--------------- LegalEntity 
^               ^ 
|--is-a- Customer<Organization> (--has-a--) Organization -is-a-| --has-many 
L--is-a- Natural<Person>  (--has-a--) Person -------is-a-|  | 
              ^      | 
               L--is-a- Employee -------| 

但你也可以進一步簡化在這種情況下,模型:

Customer 
    |--has-a LegalEntity <---is-a-- Organization --has-many-| 
         L-is-a-- Person <--is-a- Employee 

或者你可以使用人作爲基礎,但導致更醜型號:

Person 
<- Employee ---- Organization <- Corporate Customer 
<- Natural Customer ----|    | 
      |       | 
      L------------------------------->> ICustomer 

在這種情況下,你的Person可以是一個EmployeeNatural Customer(但不能同時),再加上你不能CRE吃了一個Customer列表,其中包含Natural CustomerCorporate Customers,除了通過接口,但實體框架並不總是理解這些。這個模型感覺很尷尬,但似乎更接近你目前的模型。

您所需的全保真模型無法使用.NET或Entity Framework構建。

相關問題