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 | ...
...在插件欄將是我可以反序列化回一類的插件的序列化表示形式。然而,這似乎是一個可怕的/哈克的想法。有一個更好的方法嗎?
EAV不是一個真正的「純粹的關係設計」,因爲PropertyValue列最終變得非常無類型,而且很困難管理約束。但對於靈活的數據庫設計來說,這是少數選擇之一。不過,它並不比XML blob好得多。 – 2012-01-13 01:21:54
同意......但是如果他想要找到類似以下內容的所有用戶:將給Plugin1的Property1設置爲「val1」的所有用戶,那麼這是使用關係數據庫的唯一方法(當然,如果他使用關係數據庫並且不像MongoB)。無論如何,我修改了我的答案:「純粹的關係設計」=>「更多關係方法」 – 2012-01-13 01:23:47