4

[前標題:有沒有辦法強制基於標籤的組織方法論的關係結構?]如何在基於標籤的組織中定義結構?

我有一些實體,他們有一系列的屬性。某些屬性會影響實體可以具有的其他屬性,許多屬性會被組織爲組,並且偶爾會要求實體具有來自某些組的某些數量的屬性,或者可能包含來自某些組的某些屬性。

有沒有一種方法來使用數據庫這些各種各樣的標籤 - 標籤的關聯度,如要求,編組,排除等模式,或者是這唯一可能與編程「業務規則」?理想情況下,我希望可能的標籤及其關係易於配置,因此非常靈活。

我考慮過的方法之一是有標籤和可能的關係,然後你得到一個標籤標籤應用關係排序表,但這似乎是一個相當脆弱的方法。

所以,這可能更嚴謹的方式,如果是的話,我將如何甚至開始着手呢?

回答

4

編輯:您對僅應用取決於其他屬性中值的變量屬性的描述是非關係非歸一化設計。 RDBMS可能不是存儲這類數據的最佳解決方案。對於需要這種靈活性的數據來​​說,RDF可能是一個很好的解決方案。

我剛纔的答覆,關於RDBMS的解​​決方案,下面是:與Entity-Attribute-Value設計


有人模型靈活的屬性,但這往往是太非結構化和你結束了數據完整性問題的戰鬥。僅當您需要實際上無限數量的實體子類型時才使用它。

其他人使用Single Table Inheritance,您將所有子類型使用的所有屬性列放入一個非常寬的表中,並在屬性與子類型無關的行上將它們留空。但是這有侷限性,因爲表格可能變得太寬,而且你失去了強制使用任何屬性的能力,因爲它們必須都是可空的。

如果實體子類型數量較少,我建議爲每組必需屬性創建一個從屬表。定義從屬表的主鍵作爲父表的外鍵,因此您可以獲得一對一的關係。

CREATE TABLE Vehicles (
    vehicle_id INT PRIMARY KEY 
    ...attributes common to all vehicles... 
); 

CREATE TABLE Automobiles (
    vehicle_id INT PRIMARY KEY, 
    ...attributes specific to autos... 
    FOREIGN KEY (vehicle_id) REFERENCES Vehicles(vehicle_id) 
); 

您還可以通過在父表的主鍵中編碼子類型來提供更多的數據完整性。這是爲了確保Automobiles中的一排不能參考Vehicles中的摩托車。

CREATE TABLE Vehicles (
    vehicle_id INT, 
    vehicle_type VARCHAR(10), 
    ...attributes common to all vehicles... 
    PRIMARY KEY (vehicle_id, vehicle_type), 
    FOREIGN KEY (vehicle_type) REFERENCES VehicleTypes (vehicle_type) 
); 

CREATE TABLE Automobiles (
    vehicle_id INT, 
    vehicle_type VARCHAR(10) CHECK (vehicle_type = 'Automobile'), 
    ...attributes specific to autos... 
    FOREIGN KEY (vehicle_id, vehicle_type) 
    REFERENCES Vehicles(vehicle_id, vehicle_type) 
); 

當然,你需要創建一個新的從屬表在每次定義一個新的子類時,但這樣的設計確實給你更多的結構,以保持數據完整性,NOT NULL屬性,等等。

您需要在應用程序邏輯中強制執行的唯一部分是確保在Vehicles的 ='Automobile'中爲每行創建一行Automobiles

2

使用數據庫來執行規則或在別處使用源代碼沒有區別。代碼是數據。這就是深奧的Lisp答案。

你問的真正問題是這在關係數據庫中還是在(我假設)Algol家族語言中更容易。你沒有指定一個RDBMS,所以我將假設ANSI。這使得這很難。

順便說一下,在Prolog中這很容易。但那不是在這裏,也不在那裏。

我會說使用檢查約束的一切。這種方法所需要的心理轉變是意識到你的UI將需要一種方法來定義這些標籤關係。傳統上,您可以從UI向數據庫發出CRUD語句。相反,您需要向CRUD檢查約束髮出ALTER TABLE語句。

有兩個問題的方法:

  • 這樣的語句在大多數RDBMS的參數化。認爲SQL注入。
  • 各種實現在對全ANSI檢查約束的支持方面有所不同。如果子查詢不受支持,則忘記它。

如果你可以用一個特定的RDBMS來澄清你的問題,那麼我們可以給你一個更好的答案。