我应该如何设计我的关系表?
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
我很好奇构建我的数据库的实用性。想象一下,我想进行一项调查,询问一组学生他们在 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