代码之家  ›  专栏  ›  技术社区  ›  shylent

在数据库中存储任务

  •  0
  • shylent  · 技术社区  · 15 年前

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

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

    客户机定期对数据库进行轮询,以检查是否存在 任务 表演。任务是:

    1. 任务的正式名称(字符串),例如“运行回归测试”
    2. 多个参数。为了简单起见,我们假设这些是字符串。没有必要支持超过十个论点。

    如果客户机检索到一个任务,它将解析名称和参数并执行某些操作。

    因为所有的状态信息都存储在数据库中,所以任务也必须存储在那里。我真正不知道的是如何尽可能干净地实现这一点。我能想到的每一个解决方案似乎都是反模式的。我们可以将它存储在这样的一个表中:

    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参数表中添加“sequence”列来修复)。

    我相信有更好更清洁的方法来做我想做的。也许在应用程序设计方面有更好技能的人能给我一些启发。

    事先谢谢。

    2 回复  |  直到 15 年前
        1
  •  2
  •   LukáÅ¡ Lalinský    15 年前

    基于 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 .

        2
  •  1
  •   Topher Fangio    15 年前

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

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

    但是,如果客户机已经相当聪明了,或者它们是用一种语言编写的,这使得与数据库的接口变得困难(也许是C),那么我可以将整个“命令任务”存储为一个字符串,并让客户机将其解析为令牌。

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