Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库管理系统中基于投票的审批系统_Sql_Postgresql_Database Design - Fatal编程技术网

Sql 数据库管理系统中基于投票的审批系统

Sql 数据库管理系统中基于投票的审批系统,sql,postgresql,database-design,Sql,Postgresql,Database Design,我尝试创建一个系统,通过大众投票自动批准提议的职位。我目前正在评估我可以在DBMS中完成的部分,以及它是否合理。我使用PostgreSQL,如果这对我有帮助的话,我可以升级到最新版本 我的数据库结构如下所示: CREATE TYPE state AS ENUM ('write', 'vote'); CREATE TABLE post ( id SERIAL NOT NULL CONSTRAINT post_pkey PRIMARY KEY, title VARCHAR(100),

我尝试创建一个系统,通过大众投票自动批准提议的职位。我目前正在评估我可以在DBMS中完成的部分,以及它是否合理。我使用PostgreSQL,如果这对我有帮助的话,我可以升级到最新版本

我的数据库结构如下所示:

CREATE TYPE state AS ENUM ('write', 'vote');

CREATE TABLE post
(
  id SERIAL NOT NULL CONSTRAINT post_pkey PRIMARY KEY,
  title VARCHAR(100),
  state state
);

CREATE TABLE proposal
(
  id SERIAL NOT NULL CONSTRAINT proposal_pkey PRIMARY KEY,
  post_id INTEGER CONSTRAINT proposal_post_fkey REFERENCES post,
  text TEXT
);

CREATE TABLE accepted
(
  id SERIAL NOT NULL CONSTRAINT accepted_pkey PRIMARY KEY,
  post_id INTEGER CONSTRAINT accepted_post_fkey REFERENCES post,
  text TEXT
);

CREATE TABLE vote
(
  proposal_id INTEGER CONSTRAINT vote_proposal_fkey REFERENCES proposal,
  user_id INTEGER,
  PRIMARY KEY(proposal_id, user_ID)
);

我现在的目标是基于一个或多个查询,将提案复制到accepted,并根据以下规则设置要写入的状态:

  • 如果提案的票数高于阈值n
  • 如果只有一项提案的票数最高

  • 我现在的问题是,这是否可以明智地在PostgreSQL内部完成,还是应该在外部完成,以及您是否可以为我指出正确的查询方向。

    假设投票是逐个插入的,而不是批量插入的,那么您可以使用
    投票
    上的触发器执行您想要的操作

    基本上,当检索到投票时,触发器将:

    • 计算提案的总票数
    • 检查总数是否符合阈值。如果是这样的话,那么做你想要的“接受”
    就个人而言,我会调整你的设计。而不是一个
    接受的
    表,我只需要在
    提案
    中有一个标志。我还将修改
    提案
    ,以获得总票数。而且,我不清楚什么或者提案是否相互竞争——也就是说,如果一个提案被接受,是否会妨碍对其他提案的投票


    此外,如果提案中的选票被“删除”,您不清楚会发生什么。

    好的方面。为了brevety的缘故,我从所有这些中删除了一个组件。它们有一个时间跨度。只有达到投票门槛时,阶段才会切换。选票不会从提案中删除。它们留着待会儿用。他们的选票确实相互竞争。因此,我有一个问题,就是在转换时,两项建议的票数可能是相同的。我不知道如何在一个查询中过滤掉它。