我希望得到一些关于如何处理问题的建议我必须为使用节点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
);
然后填充posts表中的平均评论数据。但是我不确定如何保持匿名。
我考虑分成两个表
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数据库的初学者。关于如何更好地处理这个的任何建议表示赞赏。访问级别会更好吗?
答案 0 :(得分:0)
我不明白为什么它不会允许"编辑价值观以及从长远来看未来的证明"。如果你想隐藏谁投票的东西,但能够检查是否有投票,你可以使用一些哈希。例如,假设用户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