2010-01-11 22 views
2

我正在使用以下設計的數據庫。我認爲在數據庫設計中封閉循環並不是一個好習慣,而且我有不止一個。但我不記得爲什麼。所以不知道這可能會如何影響我。任何例子這可能是危險的?sql閉環關係;會出現什麼問題?

schematic of part of our database

編輯:通過我的電子書去了,發現我正在讀爲開始數據庫設計從入門到精通,出版商:A按。
他們只是警告這一點,但給出一個模糊的原因。不,我們沒有使用觸發器。任何人有更清楚的解釋?
感謝 摘錄,第109頁:

一個小公司的員工誰了許多不同的 小項目組的每一個工作 。每 所有員工都裝在一個 特別是房間較大的房間 住房若干組groups.We可能需要 信息,如每個 員工所在,特定 員工的電話號碼,在哪裏可以找到 特定組,其中員工 在每個組中工作,誰在每個 房間中,等等。一個可能的數據 模型如圖5-7所示。以 時刻爲例,瞭解數據模型 及其包含的信息約 房間中的組數,因此 針對此特定問題。 模型有冗餘信息。你可以看到 是什麼?

example figure

對於例5-3,如果我們 經常要找出僱員 電話號碼,我們可能會認爲,在圖5-7 員工之間的 頂部關係和房間將是一個有用的 直接路線。然而,通過Group的替代路線,這個相同的 信息很容易得到 。 我們可以找到該員工的(僅限一個) 組,然後找到該組的(僅限一個 )空間。這是一個非常簡單的 檢索(它並不涉及所有 複雜的日期,困擾 例5-2的小宿舍)。 但是,額外的關係不是 只是不必要的,這是危險的。 對於相同的 信息有兩條路線,我們冒險得到兩個不同的答案 ,除非數據是非常仔細維護的 。每當 員工更改組或 班次時,將會有兩個 關係實例進行更新。 不小心更新 程序,我們可以最終不得不 吉姆是在A組,這是在12 室,而其他途徑可能 已經吉姆直接與房有關的 15冗餘信息,很容易出現矛盾和應該始終將 刪除。

+0

你的圖片無效。 – 2010-01-11 08:23:37

+0

看不到「以下設計」。你的意思是TableA有FK參考TableB有FK參考TableC有FK參考TableA? – 2010-01-11 08:48:24

+0

固定鏈接設計URL – devio 2010-01-11 13:22:51

回答

1

我在過去使用表之間的「閉環」引用(即至少3個關係循環中)沒有問題。我能想到的唯一問題是如果你使用觸發器,並且即使這樣,如果你正在更新觸發器中的「循環」中的其他表,那也只會是一個問題。

對於沒有閉環的閱讀建議,您有參考嗎?

爲了誰評論說,如果你的鏈接複製到一個新窗口中的圖像可以看到其他人:http://imgur.com/ChFL1

+0

添加了相關摘錄,不,我們沒有使用觸發器。 – Slabo 2010-01-12 04:21:37

+0

你書中給出的例子有點做作。在您的設計中我沒有看到任何主要問題,但由於您在[Slab] - > [Plate]和[Plate]之間存在關鍵關係,因此可能會在[Slab],[Plate]和[ReportCoolingBed]表格之間保持數據一致的問題[平板] - > [ReportCoolingBed],然後在[Plate]和[ReportCoolingBed]之間建立1-1關係。 它可能有助於查看每個表中使用的主鍵/外鍵的屬性。 – Tony 2010-01-12 10:47:54

3

並非所有的數據庫都推遲因果關係確認啓用,不是所有的數據庫允許插入兩條記錄到兩個不同的表中一個聲明。

想象一下,你有一個FOREIGN KEYABBA

最初,兩個表都是空的。

你打算如何插入第一條記錄?

你不能插入任何東西到A,因爲它必須引用B(它是空的)中的記錄,並且以同樣的方式,你不能在B中插入任何東西。

+0

在我的情況下,我有一個從A到B的1-n關係,然後是從B到C的1-n關係,然後是從A到C的1-n關係。在不同的情況下,我們也有循環。 – Slabo 2010-01-12 04:26:38

+0

'@ Slabo':你剛剛描述的情況不包含循環。 – Quassnoi 2010-01-12 10:17:46

0

我不會說「封閉循環不是好習慣」。但是,他們確實提請注意潛在的問題。因此,檢查所有閉環以解決此問題的可能性是一個好習慣。

教科書示例對我來說似乎很清楚。有2種方式中的位置/員工的電話可以判定:

  • 員工 - >集團 - >室 - >手機
  • 或員工 - >室 - >手機

這就像存儲需要保持同步的同一事物的兩個變量。有可能出現問題,變量最終會出現不同的值 - 那麼你必須問:「哪兩個是正確的?」

因此,課本示例突出顯示了您必須關注的問題。然而,這個問題真的歸結爲語義。即這些關係意味着什麼。在教科書示例中,到Room的兩條路徑的含義完全相同。但是,如果Group -> Room僅僅是每個員工的「默認」,因爲高級員工可以獲得自己的空間,或者員工可以暫時被分配到在其他地方以外的其他地方工作,那麼額外的關係就是合理的。

移動到你的設計,這是你應該做的:

  • 看封閉式團體
  • 評估
  • 檢查你有沒有剛創建的關係的語義/用途/含義兩條路徑完全相同信息

例如,您有:

  • TestSample - >線圈 - >板
  • TestSample - >板 - >板

原諒的可能荒謬地瞭解您術語。)這是否意味着您的測試樣本可以同時在2個不同的平板上?或者這是否意味着您的測試樣品將由可能(但不一定)來自不同板的板和線圈組成?

相關問題