2008-09-17 66 views
4

我設計這個集合類和抽象(爲MustInherit)類...如何在我的數據庫中執行數據完整性規則?

class diagram http://img396.imageshack.us/img396/1711/nodeclassinheritanceej0.gif

這就是我要去的地方來存儲所有這些數據庫表...

database table http://img179.imageshack.us/img179/3237/nodetablenorootln3.gif

據Microsoft SQL Server數據庫知道,這些都是可以爲空(「允許空」)列。

但真的,這取決於存儲在那裏的類:LinkNode,HtmlPageNode或CodePageNode。

規則可能是這樣的......

rules table http://img127.imageshack.us/img127/74/datarulesha0.gif

我如何執行我的數據庫內,這樣的數據完整性規則?


更新:關於這單表的設計...

我仍然試圖在零上的最終架構。

我最初開始時使用了幾乎沒有nullalbe字段的小表。
Which is the best database schema for my navigation?

而且我瞭解了LINQ to SQL IsDiscriminator屬性。
What’s the best way to handle one-to-one relationships in SQL?

但後來我才知道LINQ to SQL只支持單表繼承。
Can a LINQ to SQL IsDiscriminator column NOT inherit?

現在我試圖用類和抽象類的集合來處理它。
Please help me with my .NET abstract classes.

回答

2

在表上使用CHECK約束。這些允許您使用任何種類的布爾邏輯(包括表中的其他值)來允許/拒絕數據。

Books Online網站:

您可以創建一個CHECK約束與 任何邏輯(布爾)表達式 返回TRUE或者基於 邏輯運算符FALSE。對於前面 例如,邏輯表達式爲: 薪金> = 15000和SALARY < = 100000

2

爲每種類型的節點都有一個唯一的表。

爲什麼不只是讓您正在構建的類實現其自己類型的數據完整性?


編輯

在這種情況下,你可以一)使用邏輯約束(見下文)或b)存儲過程執行插入/編輯(一個好主意,不管)或c)再次,只是讓班級執行數據完整性。

C & B的混合物將是我採取的事件的過程。我將爲每個節點類型(即Insert_Update_NodeType)添加/編輯具有唯一的存儲過程,並使該類在保存數據之前執行數據驗證。

+0

查看有關單表設計的更新問題。 – 2008-09-17 18:47:48

1

這可能不是你想要聽到的答案,但要避免邏輯不一致的最佳途徑,你真的想看看database normalisation

+0

查看有關單表設計的更新問題。 – 2008-09-17 18:48:25

0

SQL Server不知道你的類的任何信息。我認爲你必須通過使用一個Factory類來執行此操作,該類可以爲你構造/解構所有這些類型,並確保根據類型傳遞正確的值。

從技術上講,這不是「強制實施數據庫中的規則」,但我認爲這不能在單個表中完成。字段要麼接受空值,要麼不接受。

另一個想法可能是探索執行相同操作的SQL函數和存儲過程。但是你不能強制一個字段對於一個記錄不是NULL,對於下一個記錄是NULL。這是您的業務層/工廠工作。

1

我對SQL Server並不熟悉,但是我知道Oracle可以指定您可以用來執行您要查找的約束條件。我很確定你也可以在SQL服務器中定義約束。

編輯:我發現這個link似乎有很多信息,種類很長,但可能值得一讀。

1

Stephen's答案是最好的。但是,如果你必須,你可以添加一個檢查約束HtmlOrCode列和其他列需要改變。

2

您可以設置一些插入/更新觸發器。只需檢查這些字段是否爲nullnotnull,並在需要時拒絕插入/更新操作。如果要將所有數據存儲在同一個表中,這是一個很好的解決方案。

您也可以創建一個獨特的表,每個類也是如此。

2

就我個人而言,我始終堅持要通過觸發器或檢查約束將數據完整性代碼放在表本身上。原因是您無法保證只有用戶界面纔會更新插入或刪除記錄。你也不能保證某人可能不會寫出第二個sp來解決原始sp中的約束,而不理解實際的數據完整性規則,甚至不會寫它,因爲他或她沒有意識到規則的存在。表經常受到DTS或SSIS包,用戶界面或查詢分析器或查詢窗口的動態查詢,甚至是運行代碼的計劃作業的影響。如果你不把數據完整性代碼放在表級別,那麼你的數據遲早不會完整。

+0

我同意。在最低級別實施數據完整性是未來發展的一種形式。 – 2008-09-18 16:21:02