溫溫醬
2019-05-29 15:57:14
如何在數據庫中表示繼承?我正在考慮如何在SQL Server數據庫中表示復雜的結構。考慮一個需要存儲一系列對象細節的應用程序,這些對象共享一些屬性,但有許多其他屬性不常見。例如,商業保險計劃可能包括同一保單內的責任,汽車,財產和賠償保險。在C#等中實現它是微不足道的,因為您可以創建一個帶有Sections集合的Policy,其中Section是根據各種類型的封面所需繼承的。但是,關系數據庫似乎不容易這樣做。我可以看到有兩個主要選擇:為所有可能的變體創建一個Policy表,然后是一個Sections表,其中包含所需的所有字段,其中大部分都是null。創建一個Policy表和許多Section表,每個表對應一種封面。這兩種替代方案似乎都不令人滿意,特別是因為必須在所有Sections中編寫查詢,這將涉及大量連接或大量空檢查。這種情況的最佳做法是什么?
4 回答

小怪獸愛吃肉
TA貢獻1852條經驗 獲得超1個贊
第三個選項是創建一個“Policy”表,然后是一個“SectionsMain”表,它存儲所有部分類型中共同的所有字段。然后為每種類型的部分創建其他表,這些表只包含不常見的字段。
確定哪個最佳取決于您擁有的字段數以及編寫SQL的方式。他們都會工作。如果你只有幾個領域,那么我可能會選擇#1。對于“很多”的領域,我會傾向于#2或#3。

神不在的星期二
TA貢獻1963條經驗 獲得超6個贊
根據提供的信息,我將對數據庫建模以具有以下內容:
政策
POLICY_ID(主鍵)
負債
LIABILITY_ID(主鍵)
POLICY_ID(外鍵)
性能
PROPERTY_ID(主鍵)
POLICY_ID(外鍵)
......依此類推,因為我希望政策的每個部分都有不同的屬性。否則,可能會有一個SECTIONS
表,除此之外policy_id
,還有section_type_code
...
無論哪種方式,這將允許您支持每個策略的可選部分......
我不明白你對這種方法的不滿意 - 這是你在保持參照完整性而不是復制數據的同時存儲數據的方式。這個詞是“標準化的”......
因為SQL是基于SET的,所以它對于程序/ OO編程概念來說相當陌生,并且需要代碼從一個領域轉換到另一個領域。通常會考慮ORM,但它們在大批量復雜系統中不能很好地工作。

蠱毒傳說
TA貢獻1895條經驗 獲得超3個贊
另一種方法是使用INHERITS
組件。例如:
CREATE TABLE person ( id int , name varchar(20), CONSTRAINT pessoa_pkey PRIMARY KEY (id));CREATE TABLE natural_person ( social_security_number varchar(11), CONSTRAINT pessoaf_pkey PRIMARY KEY (id)) INHERITS (person);CREATE TABLE juridical_person ( tin_number varchar(14), CONSTRAINT pessoaj_pkey PRIMARY KEY (id)) INHERITS (person);
因此,可以在表之間定義繼承。
添加回答
舉報
0/150
提交
取消