2010-05-16 263 views
0

我有一個應用程序,其中有一個名爲Hull的通用對象(表)。表中的每個船體都是獨一無二的。
實體關係多個1:1的

我有另一個對象有三個外殼,但他們具體是Port_Hull,Center_Hull和Starboard_Hull。

與其創建一對多關係,我試圖爲每個關係創建一對一的關係,但這會導致很多錯誤,除非我將關係從Hull傳遞到Vessel一對多(它不是)。任何想法我是如何去做的,還是應該拋棄這個概念,讓它成爲一對多的關係,並處理總是有三個條目的列表?

p.s.使用uniqueidentifiers,因爲許多用戶可以在斷開連接時添加記錄。

赫爾表

  • HullID唯一標識符(主鍵)
  • 加上一束船體數據字段的

船隻表

  • VesselID唯一標識符(主鍵)
  • MainHullID uniqueidentifier(試圖爲重點和非重點)
  • PortHullID唯一標識符
  • StarboardHullID唯一標識符
  • 加上一堆容器數據字段

回答

0

可以解決這個問題1:兩個1不同的方式:

  1. 添加唯一約束在容器中的各invidivual赫爾領域,即MainHull,PortHull,StarboardHull。這將確保船隻只能由一艘船隻使用。
  2. 從船隻中刪除船體字段,併爲船體添加一個新字段。然後明確命名該船體屬於的船隻。將HullType添加到Hull似乎也是有意義的,所以你知道它是什麼類型的船體。對HullType + Vessel的唯一約束將確保每個船隻最多隻能獲得一種類型的船體(但不幸的是,可能具有給定類型的0個)。

我會去第一個。因爲選擇一艘船然後找到相關的船體似乎更自然,並且還確保每艘船都具有所需的3個船體(在MainHull,PortHull,StarboardHull上分配非空限制)。

編輯:看到你的評論,並且鑑於船隻不需要3個船體,那麼第二個解決方案也值得考慮。如果需要添加其他類型的船體,可以在不更改模式的情況下執行此操作,因爲船體類型不是從它所引用的字段推斷出來的,而是在提議的'HullType'字段中明確命名的。

+0

問題與方法一(我認爲),並不是每艘船都有三個船體(我簡化了我原來的文章)。
有些船隻是單體船,只有Mainhull,有些船隻是雙體船,有PortHull和StarboardHull。
我想知道是否對於船體表我應該使主鍵的VesselID字段加1個船體字符字段(M,P&S),使兩個表之間的關係與一個外鍵索引VesselID,然後處理編碼中的關係? – Evan 2010-05-17 00:04:35

+0

我會在船體上保留一個代理HullID - 你不想要複合PK - 在後面真正的痛苦。相反,在VesselID和M,P,S char字段上創建一個唯一的約束 - 我在我的答案中稱爲HullType。這樣,你可以確保一艘船最多隻有一個給定類型的船體。現在,對給定類型的船體進行天氣測試對於給定容器是有意義的,這是另一個問題,您可以在代碼中簡單解析(可能在db模型中,但是很複雜)。您有一個複雜的域模型,您正在映射到數據庫 - 你有沒有考慮過使用對象關係映射工具,例如NHibernate的? – mdma 2010-05-17 00:20:40

+0

大聲笑 - 我試圖使用VisualStudio實體框架工具,如果它只是退出給我奇怪的錯誤和識別東西線枚舉。 NHibernate爲.net添加功能的標準框架? – Evan 2010-05-17 00:40:39

0

你問是否有可能創造這個還是你應該創建此的?

首先,它是可能的:當你有一個孩子表的外鍵父表和外鍵必須是唯一的創建1的關係:

Create Table Vessel 
(
    VesselId uniqueidentifier not null primary key 
    , MainHullId uniqueidentifier not null 
    , PortHullId uniqueidentifier not null 
    , StarboardHullId uniqueidentifier not null 
    , ... 
    , Constraint FK_Vessel_Hull_Main 
     Foreign Key (MainHullId) 
     References Hull(HullId) 
    , Constraint FK_Vessel_Hull_Port 
     Foreign Key (PortHullId) 
     References Hull(HullId) 
    , Constraint FK_Vessel_Hull_Startboard 
     Foreign Key (StarboardHullId) 
     References Hull(HullId) 
    , Constraint UC_Vessal_MainHullId Unique (MainHullId) 
    , Constraint UC_Vessal_PortHullId Unique (PortHullId) 
    , Constraint UC_Vessal_StarboardHullId Unique (StarboardHullId) 
) 

A 1。

現在,至於它是否是一個好的設計,這將取決於問題領域。看起來很奇怪,有一個基於左,右和中心的三種不同的船體,但也許我錯過了一些東西。

+0

嗯,實際上,這兩個問題。 但至於你的第二個問題。每個船體可以包含不同的部件(坦克,發動機等),實際上可以是不同的尺寸(也被捕獲)。 IE瀏覽器。典型的三體船有一個更大的中心船體和兩個較小的左舷和右舷船體。 我實際上已經簡化了我的問題,因爲我也有Vessels單體船和雙體船有兩個船體。我基於vesseltype字段爲單體船,雙體船和三體船創建不同的實體對象。這三種類型的方法假定不同的業務規則。 – Evan 2010-05-16 23:48:18