PostgreSQL 数据库结构/匿名数据的模式



我希望得到一些关于如何处理我必须为使用节点 js 和 SQL 后端构建的评论网站构建数据库的问题的建议。对于这个网站,我们希望对某些帖子的不同用户进行 10 分的评论,并获得每个帖子的平均值。唯一的问题是我们希望它保持匿名,这样没有人可以进入表格并编辑或查看结果。数据库的当前架构如下所示:

CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
email TEXT UNIQUE,
password TEXT NOT NULL
admin BOOLEAN
);
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title VARCHAR(250) NOT NULL,
date DATE NOT NULL,
avg_review INTEGER
)

因此,从网站上的提交表单中,我想将数据添加到表中以收集评论数据,以便可以在上面的帖子表中输入以获取avg_review,因此特定帖子的平均评论数据。我的麻烦是使它匿名,并使每个用户的投票独一无二。更新:我最初的想法是使用以下方法:

CREATE TABLE review (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
post_id INTEGER REFERENCES posts(id),
review_value INTEGER
);

然后,这将填充帖子表中的平均评论数据。但是,我不确定如何保持匿名。

我考虑分成两张桌子

CREATE TABLE review (
id SERIAL PRIMARY KEY,
post_id INTEGER REFERENCES posts(id),
);
CREATE TABLE votecheck (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
post_id INTEGER REFERENCES posts(id),
);

然后,这将记录投票,而不会看到谁做了投票,并记录用户是否已经投票支持帖子,以便以后检查唯一性。

我想知道是否有更好的方法来做到这一点,因为我觉得按照上次发布的方式这样做,从长远来看,它不允许编辑值和未来证明它。提前道歉,因为我是SQL数据库的初学者。关于如何更好地处理这个问题的任何建议,我们将不胜感激。访问级别会更好吗?

我不明白为什么它不允许"从长远来看编辑值并对其进行未来证明"。如果你想隐藏谁投票给了什么,但又能够检查投票是否有地方,你可以使用一些哈希。例如,假设用户 1 对帖子 1 和 2 进行了投票,那么您可以有一个表格:

create table vote_placed(c uuid pk);

所以当你投票时,你这样做

insert into vote_placed select md5('1,1')::uuid;
insert into vote_placed select md5('1,2')::uuid;

因此,如果您尝试再次投票,您会因为重复PK而获得异常。

要检查用户是否投票,您可以

select true from vote_placed where c = md5('1,1')::uuid

然而,仅仅选择表格不会给你关于谁投票的明显信息......因此,您可以避免以下情况:对于一个帖子,只有一个人投票并且知道您知道谁投了确切的票 - 当然,您可以检查是否有人投票,但您不能确定只有一个人。此外,为了掩盖第一个选民,您可以用随机白噪声预填充vote_placed表,例如md5('manah, manah')::uuid

最新更新