我正在处理某个应用程序。其基本结构如下:
客户端定期轮询数据库,以检查是否有任何任务要执行。任务是:
如果客户端检索任务,它会解析名称和参数并执行某些操作。
由于所有状态信息都存储在数据库中,因此任务也必须存储在那里。我真正不知道的是,如何尽可能干净地实现这一点。我能想出的每一个解决方案看起来都像是反模式。可以将它存储在一个表中,如下所示:
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表中添加“序列”列来修复)。
我相信有更好,更清洁的方法可以做我想做的事。也许拥有更好应用设计技能的人可以给我一些启发。
提前致谢。
答案 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)编写,那么我可能只将整个“命令任务”存储为字符串并拥有客户端将其解析为令牌。
根据语言的不同,两者都有明显的缺点,但我认为你的最终决定归结为你想把大部分逻辑放在哪里。