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

本文关键字:数据库 设置 存储 用户 用于 | 更新日期: 2023-09-27 18:20:14

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

。其中插件列将是插件的序列化表示形式,我可以将其反序列化回类。 然而,这似乎是一个糟糕/笨拙的想法。 有没有更好的方法可以做到这一点?

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

如果您不必通过插件列中序列化的某些属性来查询数据库,我认为这不是一个糟糕/笨拙的想法。也。。。您可以考虑使用一些非模式数据库,例如MongoDB。无论如何,我会通过序列化来做到这一点(可能是 JSON 对象,如果我稍后会从 javascript 中使用该结果,或者如果更适合您的环境,则使用一些 XML(。

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

User
-----
UserID
Name
Plugin
------
PluginID
PluginName
PlugInProperty   
------------------
PlugInPropertyId
PluginID
UserPlugin
------------
UserPluginId
UserId
PluginId
UserPlugInProperty
------------------
UserPluginId
PlugInPropertyId
Value