2012-01-13 78 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