2012-05-31 29 views
0

我有一個表tablet,列period_idtablet表與表period有多對一的關係,period表與表sub_period有一對多的關係。我需要能夠在tablet中指定單個sub_period條目,其中的選擇受period條目限制,但由於sub_period僅取決於period,所以我不能。我應該如何建模?如何構建這些關係?

在我的模型中,每個tablet行應該有一個period條目和一個sub_period條目。 periodsub_period之間的關係應該是1:n(一個時期可能有許多子時期,但每個子時期只能屬於一個時期)。該sub-period的I希望能夠從tablet選擇應該由我選擇的period

編輯限制:已經意識到我需要一個N:tabletperiod之間一對一的關係:很多片可以涉及同期。

+0

問題是什麼應該是這個子期到你的平板電腦表入口? Functionnaly – Sebas

+0

'sub_period'如何記錄與'period'的關係?當然它也有'period_id'列?在這種情況下,你能不能直接[join](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html)'tablet'到'sub_period那個專欄? – eggyal

+0

@sebas它將是來自sub_period的記錄子集之一,具體取決於所選的週期。假設有兩個週期:A和B.週期A具有子週期sp_A_1和sp_A_2,週期B具有子週期sp_A_3和sp_A_4。如果我的平板電腦條目鏈接到期間A,則應該只能在sp_A_1和sp_A_2之間進行選擇。 – urschrei

回答

0

然後你有2種選擇:

  • 數據庫層:通過觸發器實現一致性約束上。插入或更新後,如果sub_pediod不是平板電腦週期的子週期,請提出相應的錯誤。
  • 應用層:實施適當的GUI,只在必要時才提供正確的選擇。

第二個選項是我最喜歡的,只要它是關於非敏感數據(記住別人總是可以跳過客戶端界面),因爲它通常給了我更多的與我要如何應對「運動範圍」問題。當然總有例外......

0

當你爲你建模的時候,通常你不會創建1:1的關係,當你規範化的時候你會注意到關係表1:1的表你可以將它們匹配到一個表中,這就是我看到的它: 如果你有3個表有關係

  • 平板 1:N sub_period
  • 平板 1:1

(圖形中的鍵是初選鍵和紅色的符號是外鍵)

enter image description here

,或者你可以讓平板表和之間的匹配模型看起來像這樣

enter image description here

其中平板吸收時間段具有他的所有屬性,但這取決於你,這個模型你必須適應你的需求。

2

sub_period中創建一個可爲空的列has_tablet ENUM('1'),並在sub_period (period, has_tablet)上創建一個UNIQUE約束。

has_tablet只能接受價值1NULL,這意味着你可以設置每個週期只有一個賽季「具有平板電腦」。由於periodtablet是一對一的,因此也唯一標識tablet

根據此解決方案,可以不設置任何片劑一段時間。如果是問題,請將period添加到tablet,並使tablet (period, sub_period)參考sub_period (period, sub_period)

這是反規範化但它永遠不會導致不一致(因爲period在兩個表中都由sub_period定義)。

更新:

似乎期間平板電腦是一個一對多的。在這種情況下,只需添加make tablet參考sub_period而不是periodperiod關係可以通過簡單的連接進行傳遞。

+0

這裏的問題是,幾個平板電腦可能會在一個給定的時間段內與同一個子時間段相關聯,所以您的「每個時段一個季節」限制太多。因此,我需要的唯一限制是你不應該能夠選擇一個不屬於你選擇的期間「多」一部分的子時期。 – urschrei

+0

@urschrei:但是......你說這是'tablet'和'period'之間的一對一關係。如果許多平板電腦引用相同的子時間段,則它們也必須引用同一時間段,這與1對1平板電腦/時間段的關係相矛盾。我錯過了什麼? –

+0

@AndriyM這是我感到困惑的地方。每行只能有一個單獨的期間條目和一個單獨的子期間條目。但是這個解決方案意味着如果我將平板電腦記錄連接到一個子時間段,我就無法將任何其他平板電腦連接到該子時間段。除非我誤解。 – urschrei