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