2012-01-13 106 views
0
public interface IPlugin 
{ 
    void Execute(); 
} 

public class FirstPlugin : IPlugin 
{ 
    public string SomeSetting1 { get; set; } 

    public void Execute() { } 
} 

public class SecondPlugin : IPlugin 
{ 
    public string SomeSettingA { get; set; } 
    public string SomeSettingB { get; set; } 
    public string SomeSettingC { get; set; } 

    public void Execute() { } 
} 

我有一個允許用戶選擇一個或多個插件的系統。在上面的代碼中,我有一個由許多類實現的IPlugin接口。每個類都可以有自己的一組屬性,每個用戶都可以配置這些屬性。用於存儲用戶設置的數據庫設計

例如,用戶A僅選擇第一個插件並將SomeSetting1配置爲具有「ABC」的值。

用戶B選擇兩個插件,但將第一個插件的SomeSetting1配置爲具有「XYC」值。

public class User 
{ 
    public User(IPlugin[] plugins) 
    { 
    } 
} 

當我實例化一個用戶,我想獲得用戶已配置的插件列表,這些插件應該與用戶配置了什麼水合。

但是,我在如何設計數據庫以便能夠以這種格式存儲信息上留下了一個空白。我有一個表:

User | Plugin 
---------------- 
A  | ... 
B  | ... 
B  | ... 

...在插件欄將是我可以反序列化回一類的插件的序列化表示形式。然而,這似乎是一個可怕的/哈克的想法。有一個更好的方法嗎?

回答

1

如果您不需要通過Plugin列中序列化的一些屬性來查詢數據庫,我並不認爲它是一個糟糕的/ hacky的想法。另外...你可能會考慮使用一些非模式數據庫,如mongodb。無論如何,我會用序列化(可能是JSON對象,如果我稍後將從JavaScript中使用該結果,或者如果更適合於您的環境,則使用一些XML)來完成此操作。

如果你想留更多的關係方法......那麼你將有插件屬性表...的列:UserId, PluginId, PropertyName, PropertyValue ...那麼,表插件:PluginId, PluginName,和你的表與用戶:UserId,...and some columns for users (這只是一個方式來設計的話)的問題是,如果你有一個非常複雜的對象一些插件屬性......在這種情況下,你將不得不它們序列化爲柱的PropertyValue ...

+0

EAV不是一個真正的「純粹的關係設計」,因爲PropertyValue列最終變得非常無類型,而且很困難管理約束。但對於靈活的數據庫設計來說,這是少數選擇之一。不過,它並不比XML blob好得多。 – 2012-01-13 01:21:54

+0

同意......但是如果他想要找到類似以下內容的所有用戶:將給Plugin1的Property1設置爲「val1」的所有用戶,那麼這是使用關係數據庫的唯一方法(當然,如果他使用關係數據庫並且不像MongoB)。無論如何,我修改了我的答案:「純粹的關係設計」=>「更多關係方法」 – 2012-01-13 01:23:47

0

User 
----- 
UserID 
Name 

Plugin 
------ 
PluginID 
PluginName 

PlugInProperty 
------------------ 
PlugInPropertyId 
PluginID 

UserPlugin 
------------ 
UserPluginId 
UserId 
PluginId 

UserPlugInProperty 
------------------ 
UserPluginId 
PlugInPropertyId 
Value