我应该如何设计我的关系表?

How should I design my relational tables?

我很好奇构建我的数据库的实用性。想象一下,我想进行一项调查,询问一组学生他们在 10 个选项中的前 3 个偏好是什么。 objective是通过查看学生选择的数量来找出10个选项的排名。

最初,我的思考过程是创建以下关系 tables。

CREATE TABLE person (
    personID BIGSERIAL NOT NULL PRIMARY KEY,
    personName VARCHAR(50));

CREATE TABLE preference (
    preferenceID BIGSERIAL NOT NULL PRIMARY KEY,
    personID INT REFERENCES person(personID),
    preference1 VARCHAR(50),
    preference2 VARCHAR(50),
    preference3 VARCHAR(50));

但我开始跌跌撞撞地实现我的 objective。由于必须在所有 3 列中考虑每个偏好的计数,我当前的解决方案是然后操作我的数据(使用 Excel)直到我有以下 table:

CREATE TABLE preferenceV2 (
    personID INT,
    preference VARCHAR(50));

这里,personID不再是PK,也不再是唯一的,preference可以是10个选项中的一个。现在,我可以通过计算每个偏好的票数并对其进行相应排名(例如通过使用 PowerBI)来实现我的 objective。

但是,我意识到我最终没有利用关系数据库,并且操作到 table preferenceV2 的过程是手动的并且容易出错。对我来说最好的方法是什么?

你应该有:

CREATE TABLE preferences (
    preferenceID BIGSERIAL NOT NULL PRIMARY KEY,
    personID INT REFERENCES person(personID),
    preference VARCHAR(50)

因此,如果一个人有 3 个偏好,那么您会

   preferenceID personID preference 
        1          1         A
        2          1         B
        3          1         C
        4          2         B
        5          2         C
        6          2         D

在这种情况下你可以这样做

  SELECT preference, COUNT(preference)
  FROM preferences 
  GROUP BY preference