Скажем, у меня есть общий базовый класс/интерфейс
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>
и выполнить из них метод Execute.
Сейчас у меня только одна таблица в командах, называемых БД, и здесь я храню сериализацию строки объекта. В основном столбцы в таблице: id|commandType|commaSeparatedListOfParameters
. Хотя это очень легко и полезно для загрузки всех команд, я не могу легко запросить команды без использования подстроки и других неясных методов. Я хотел бы иметь простой способ SELECT id,x,y FROM commandA_commands WHERE x=...
и в то же время иметь общий способ загрузки всех команд из таблицы команд (я думаю, это будет какой-то UNION/JOIN команд commandA_commands, commandB_commands и т.д.).
Важно, чтобы для добавления новой команды требовалось не много ручного возиться в БД или ручное создание методов сериализации/parse-методов. У меня их много, а новые добавляются и удаляются все время. Я не возражаю против создания команды + table + query generation tool, хотя, если это потребуется для лучшего решения.
Лучшее, что я могу думать о себе, - это обычная таблица типа id|commandType|param1|param2|param3|etc..
, которая не намного лучше (на самом деле хуже?), чем мое текущее решение, так как многим командам нужны нулевые параметры, и тип данных будет изменяться, поэтому у меня есть снова обратиться к общему преобразованию строк и размеру каждого поля, достаточно большого для самой большой команды.
База данных - это SQL Server 2008
Изменить: Найти аналогичный вопрос здесь Проектирование базы данных SQL для представления иерархии классов OO