C# 存储用户设置的数据库设计
我有一个允许usesr选择一个或多个插件的系统。在上面的代码中,我有一个由许多类实现的C# 存储用户设置的数据库设计,c#,database-design,C#,Database Design,我有一个允许usesr选择一个或多个插件的系统。在上面的代码中,我有一个由许多类实现的IPlugin接口。每个类都可以有自己的属性集,每个用户都可以配置这些属性 例如,用户A仅选择第一个插件,并将SomeSetting1配置为“ABC”值 用户B选择两个插件,但将第一个插件的SomeSetting1配置为值“XYC” 当我实例化一个用户时,我想得到一个用户配置的插件列表,这些插件应该与用户配置的插件一起使用 然而,我在如何设计数据库以便能够以这种格式存储信息方面还是一片空白。我可以要一张桌子:
IPlugin
接口。每个类都可以有自己的属性集,每个用户都可以配置这些属性
例如,用户A仅选择第一个插件,并将SomeSetting1配置为“ABC”值
用户B选择两个插件,但将第一个插件的SomeSetting1配置为值“XYC”
当我实例化一个用户时,我想得到一个用户配置的插件列表,这些插件应该与用户配置的插件一起使用
然而,我在如何设计数据库以便能够以这种格式存储信息方面还是一片空白。我可以要一张桌子:
public class User
{
public User(IPlugin[] plugins)
{
}
}
。。。其中plugin列将是插件的序列化表示,我可以将其反序列化回类中。然而,这似乎是一个糟糕的想法。有更好的方法吗?如果您不必通过插件列中序列化的某些属性来查询数据库,我不认为这是一个糟糕的想法。此外,您可能会考虑使用一些非模式数据库,如MunGDB。无论如何,我会通过序列化(可能是JSON对象,如果我以后使用javascript的结果,或者一些XML,如果这更适合您的环境的话) 如果您想继续使用更为相关的方法……那么您将拥有一个包含插件属性的表……其中包含列:
UserId、PluginId、PropertyName、PropertyValue
。然后,包含插件的表:PluginId、PluginName
,以及包含用户的表:UserId,……以及一些用户列
(这只是设计它的一种方法)问题是如果你有一些插件属性是复杂的对象…在这种情况下,你必须将它们序列化到PropertyValue列…表中
User | Plugin
----------------
A | ...
B | ...
B | ...
EAV不是真正的“纯关系设计”因为PropertyValue列最终是非常无类型的,很难管理约束。但是对于灵活的数据库设计,这是为数不多的选项之一。虽然它实际上并不比XML blob好多少。同意……但是如果他想找到这样的东西:给我所有将Plugin1的Property1设置为“val1”的用户,这是使用关系数据库的唯一方法(当然,如果他使用的是关系数据库而不是mongodb)。无论如何,我修改了我的答案:“纯关系设计”=>“更多关系方法”
User | Plugin
----------------
A | ...
B | ...
B | ...
User
-----
UserID
Name
Plugin
------
PluginID
PluginName
PlugInProperty
------------------
PlugInPropertyId
PluginID
UserPlugin
------------
UserPluginId
UserId
PluginId
UserPlugInProperty
------------------
UserPluginId
PlugInPropertyId
Value