Допустим, у меня есть общий базовый класс / интерфейс
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 и т. Д.).
Важно, чтобы для добавления новой команды не требовалось много ручного перебора в БД или ручного создания serialize / parse-методов. У меня их тонны, а новые постоянно добавляются и удаляются. Я не против создать инструмент генерации команд + таблицы + запросов, хотя, если это потребуется для лучшего решения.
Лучшее, что я могу думать о себе, - это обычная таблица типа id|commandType|param1|param2|param3|etc..
, которая не намного лучше (на самом деле хуже?) Моего текущего решения, поскольку многим командам понадобятся нулевые параметры, и тип данных будет различаться, поэтому у меня есть чтобы снова прибегнуть к обычному преобразованию строк, размер каждого поля достаточно велик для самой большой команды.
База данных SQL Server 2008
Редактировать: Нашел похожий вопрос здесь Проектирование базы данных SQL для представления иерархии классов OO