【发布时间】:2011-11-09 18:29:19
【问题描述】:
假设我有一个通用的基类/接口
interface ICommand
{
void Execute();
}
然后有几个命令继承自这个接口。
class CommandA : ICommand
{
int x;
int y;
public CommandA(int x, int y)
{ ... }
public void Execute () { ... }
}
class CommandB : ICommand
{
string name;
public CommandB(string name)
{ ... }
public void Execute () { ... }
}
现在我想用一种通用方法将这些命令存储在数据库中,然后将它们从数据库中全部加载到List<ICommand> 并执行它们的执行方法。
现在我在数据库中只有一个名为 commands 的表,在这里我存储了对象的字符串序列化。基本上表中的列是:id|commandType|commaSeparatedListOfParameters。虽然这非常简单,并且适用于加载所有命令,但如果不使用子字符串和其他晦涩的方法,我就无法轻松查询命令。我想有一个简单的SELECT id,x,y FROM commandA_commands WHERE x=... 方法,同时有一种从命令表中加载所有命令的通用方法(我想这将是 commandA_commands、commandB_commands 等的某种 UNION/JOIN)。
添加新命令不需要在数据库中进行太多手动操作或手动创建序列化/解析方法,这一点很重要。我有很多,并且一直在添加和删除新的。我不介意创建命令+表+查询生成工具,但如果这是最佳解决方案所必需的。
我能想到的最好的就是像id|commandType|param1|param2|param3|etc.. 这样的普通表,它并不比我当前的解决方案好多少(实际上更糟?),因为许多命令都需要空参数并且数据类型会有所不同,所以我有再次求助于普通的字符串转换,并将每个字段的大小设置为足够大以容纳最大的命令。
数据库是 SQL Server 2008
编辑:在这里找到类似的问题Designing SQL database to represent OO class hierarchy
【问题讨论】:
标签: c# .net sql-server-2008 database-design inheritance