在数据库中存储任务

时间:2009-10-15 18:25:27

标签: language-agnostic database-design

我正在处理某个应用程序。其基本结构如下:

  • 数据库
  • 用于控制整个系统的Web界面
  • 远程计算机上的许多客户端应用程序

客户端定期轮询数据库,以检查是否有任何任务要执行。任务是:

  1. 任务的正式名称(字符串),例如“run-regression-test”
  2. 一些论点。为简单起见,我们假设这些是字符串。没有必要支持更多,比如十个论点。
  3. 如果客户端检索任务,它会解析名称和参数并执行某些操作。

    由于所有状态信息都存储在数据库中,因此任务也必须存储在那里。我真正不知道的是,如何尽可能干净地实现这一点。我能想出的每一个解决方案看起来都像是反模式。可以将它存储在一个表中,如下所示:

    create table tasks (
      id int not null auto increment primary key,
      name varchar(255),
      arg1 varchar(255),
      arg2 varchar(255),
      ...
    )
    

    我还考虑过使用两个表:

    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)
    )
    

    这也更灵活,易于实施。但是,不可能分辨出多个论证中的哪个是第一个,哪个是第二个等等(可以通过在task_args表中添加“序列”列来修复)。

    我相信有更好,更清洁的方法可以做我想做的事。也许拥有更好应用设计技能的人可以给我一些启发。

    提前致谢。

2 个答案:

答案 0 :(得分:2)

基于auto_increment列,我猜你的目标数据库是MySQL。在PostgreSQL中,我可能会为此使用一系列varchars。对于这样的事情来说更实用,其中列表中的值不是外键或者您不需要查询它们。在MySQL中你不能这样做,使用argX列或自己序列化数组是错误的,所以我会用它:

create table tasks (
    id int not null auto_increment primary key,
    name varchar(255)
);

create table task_args (
   task_id int not null,
   no int not null,
   arg varchar(255),
   primary key (task_id, no)
);

要获取任务的所有参数,您需要运行SELECT arg FROM task_args WHERE task_id=? ORDER BY no

答案 1 :(得分:1)

我会说这实际上取决于客户端如何解析信息,以及您是否希望使客户端更简单。

例如,如果您希望客户端变得简单,我建议您进行第二次设计并添加sequence列。然后,您的客户端不必尝试解析数据,它已经知道它正在查看整数(或者可以简单地询问)。

但是,如果客户端已经相当聪明,或者用一种难以与数据库接口的语言(可能是C)编写,那么我可能只将整个“命令任务”存储为字符串并拥有客户端将其解析为令牌。

根据语言的不同,两者都有明显的缺点,但我认为你的最终决定归结为你想把大部分逻辑放在哪里。

相关问题