Je travaille sur une application particulière. Sa structure de base est la suivante:Stockage des tâches dans la base de données
- une base de données
- une interface Web pour contrôler l'ensemble du système
- un certain nombre d'applications clientes sur des machines distantes
Les clients sondage la base de données à intervalles réguliers intervalles, pour vérifier si tâches à effectuer. Une tâche est:
- Un nom officiel de la tâche (une chaîne), par exemple "run-régression test"
- Un certain nombre d'arguments. Pour simplifier, supposons que ce sont des chaînes. Il n'y a pas besoin de soutenir plus que, disons, dix arguments.
Si le client récupère une tâche, il analyse le nom et les arguments et exécute certaines actions.
Étant donné que toutes les informations d'état sont stockées dans la base de données, les tâches doivent également y être stockées. Ce que je ne sais vraiment pas, c'est comment le mettre en œuvre aussi proprement que possible. Chaque solution que je peux trouver semble presque comme un anti-pattern. On pourrait stocker dans une table unique comme celui-ci:
create table tasks (
id int not null auto increment primary key,
name varchar(255),
arg1 varchar(255),
arg2 varchar(255),
...
)
Je pensais aussi de le faire en utilisant deux tables:
create table tasks (
id int not null auto_increment primary key,
name varchar(255)
)
create table task_args (
id int not null auto_increment primary key,
task_id int,
arg varchar(255)
)
C'est un peu plus souple et plus facile à mettre en œuvre aussi bien. Cependant, il est impossible de dire quel argument parmi un certain nombre d'argumens est premier, lequel est second, etc. (peut être corrigé en ajoutant une colonne "sequence" à la table task_args).
Je suis sûr qu'il y a des façons meilleures et plus propres de faire ce que je veux. Peut-être que quelqu'un avec de meilleures compétences en conception d'applications peut me donner de l'inspiration.
Merci d'avance.
Avant de pouvoir répondre à cette question, je voudrais savoir si le client exécute la tâche DB directement IE EXEC ("functionsX (param1, param2)")? Ou auront-ils besoin de recompiler leur application chaque fois qu'une nouvelle fonction est ajoutée, car ils vont "basculer" le type de fonction et appeler la fonction elle-même IE switch ("functionX") {case "functionX": functionX (param1, param2); Pause;} ? –
Non, ils n'exécutent pas la tâche directement, j'aurais peut-être dû être plus clair à ce sujet. Le nom de la tâche est associé à un certain gestionnaire sur les clients. Par exemple, la tâche portant le nom "run-regression-test" et les arguments ("/ usr/local/src") peuvent signifier "exécuter le script regression-test.sh dans le répertoire/usr/local/src". – shylent