PostgreSQL |如何在调查中存储用户答案?

时间:2019-02-19 17:56:19

标签: sql postgresql

我的任务是创建仅可通过邀请某些人获得的调查问卷。一个人可以参加一次调查。该调查仅在特定时间段内可用。我正准备为这个将来的应用程序创建数据库结构。作为数据库,我使用PostgreSQL。

据我了解,一项调查可能会有很多问题。同时,一个问题可以在许多调查中重复使用。这是多对多的关系。

这就是我创建表的方式来解决第一个任务。如果我在某个地方错过或做错了,请纠正我。

QUESTIONS表格:

CREATE TABLE QUESTIONS(
    ID SERIAL PRIMARY KEY,
    TEXT TEXT NOT NULL
);

SURVEYS表格:

CREATE TABLE SURVEYS(
    ID UUID PRIMARY KEY NOT NULL DEFAULT uuid_generate_v4(),
    NAME VARCHAR NOT NULL,
    DESCRIPTION TEXT,
    START_PERIOD TIMESTAMP,
    END_PERIOD TIMESTAMP
);

SURVEYS_QUESTIONS表格:

CREATE TABLE SURVEYS_QUESTIONS(
    ID SERIAL,
    SURVEY_ID UUID NOT NULL,
    QUESTION_ID INT NOT NULL,
    PRIMARY KEY (ID),
    FOREIGN KEY (SURVEY_ID) REFERENCES SURVEYS (ID) ON DELETE CASCADE,
    FOREIGN KEY (QUESTION_ID) REFERENCES QUESTIONS (ID) ON DELETE CASCADE
);

目前,我不了解如何正确地将用户与调查联系起来以及如何正确存储用户答案。

2 个答案:

答案 0 :(得分:1)

使用指向TAKEN_SURVEYS表的外键和指向SURVEYS表的外键创建一个USERS表。如果要确保每个用户只有一份调查问卷记录,请在TAKEN_SURVEYS表上创建唯一索引。

答案 1 :(得分:1)

考虑用两个新表替换最后一个表。这与经典的101个“客户-订单-产品”(此处为“用户-调查-问答”)示例相符。

CREATE TABLE USER_SURVEYS (
    ID SERIAL,
    USER_ID UUID NOT NULL,
    SURVEY_ID UUID NOT NULL,
    PRIMARY KEY (ID),
    FOREIGN KEY (USER_ID) REFERENCES USERS (ID) ON DELETE CASCADE,
    FOREIGN KEY (SURVEY_ID) REFERENCES SURVEYS (ID) ON DELETE CASCADE
);

CREATE TABLE USER_SURVEYS_QA (
    ID SERIAL,
    USER_SURVEY_ID INT NOT NULL,
    QUESTION_ID INT NOT NULL,
    ANSWER VARCHAR(255),
    OTHER_SPECIFY VARCHAR(255),
    PRIMARY KEY (ID),
    FOREIGN KEY (USER_SURVEY_ID) REFERENCES USER_SURVEYS (ID) ON DELETE CASCADE,
    FOREIGN KEY (QUESTION_ID) REFERENCES QUESTIONS (ID) ON DELETE CASCADE
);