【问题标题】:PostgreSQL Database structure/ schema for anonymous dataPostgreSQL 匿名数据的数据库结构/模式
【发布时间】:2018-01-25 05:37:29
【问题描述】:

我希望就如何解决我必须为使用节点 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 数据库的初学者。任何有关如何更好地处理此问题的建议表示赞赏。访问级别会更好吗?

【问题讨论】:

    标签: sql database postgresql schema create-table


    【解决方案1】:

    我不明白为什么它不允许“从长远来看对值进行编辑和未来校对”。如果你想隐藏谁为什么投票,但又能检查投票是否有位置,你可以使用一些散列。例如,假设用户 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

    【讨论】:

    • 那么这会是拥有两张桌子而不是我展示的那张的情况吗?这是否可以让一个人获得平均值?
    • 这个会取代 votecheck 并让阅读变得不那么明显
    • 如果它是散列的,有没有办法将投票平均添加到帖子表中?另外,通过编辑值我的意思更多,如果用户犯了错误并想要更改他们的评论,这可能吗?
    • 那么有没有办法做一个像这样的表,但是有它这样评论值可以被散列出来,但仍然可以用来计算平均值:CREATE TABLE review (id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id), post_id INTEGER REFERENCES posts(id), revew_value Integer );
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多