存储用户设置的数据库设计

时间:2012-01-13 01:08:08

标签: c# database-design

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     |  ...

...插件列将是插件的序列化表示,我可以将其反序列化为类。然而,这似乎是一个可怕/黑客的想法。有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您不必通过Plugin列中序列化的某些属性查询数据库,我不认为这是一个可怕的/ hacky想法。另外......你可能会考虑使用像mongodb这样的非架构数据库。无论如何,我会使用序列化(可能是JSON对象,如果我稍后将使用javascript消耗该结果,或者如果更适合您的环境则使用某些XML)。

如果你想继续使用更多的关系方法...那么你将拥有一个包含插件属性的表格...列:UserId, PluginId, PropertyName, PropertyValue ...然后,表格包含插件:PluginId, PluginName,和你的用户表:UserId,...and some columns for users(这只是设计它的一种方法)问题是你有一些复杂对象的插件属性......在这种情况下,你必须将它们序列化为PropertyValue列...

答案 1 :(得分:0)

User
-----
UserID
Name

Plugin
------
PluginID
PluginName

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

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

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