sql - 这个社交媒体平台 PostgreSQL 数据库设计正确吗?

标签 sql database postgresql database-design database-diagram

这是一个简单的社交媒体平台的持久性设计。目前,有这些表:

  • 用户:数据库的主表,包含在我们的应用程序中注册的用户的信息。将存储在此表中的数据将是名称
    • 姓名:用户
    • 字段:id、姓名、用户名、密码、电子邮件、个人简介、关注者、关注者、图片。
    • 主键:id
  • 帖子:包含所有用户的所有帖子的数据库表。每个帖子都将包含标题、描述和帖子的主要内容。
    • 姓名:帖子
    • 字段:id、标题、图片、描述、内容、created_at、likes、user_id。
    • 主键:id
    • 外键:user_id 到表 users
  • 用户喜欢的帖子:一个表,用于定义喜欢的多个帖子与喜欢它们的用户之间的多对多关系。
    • 姓名:posts_liked_users
    • 字段:post_id、user_id
    • 外键:post_id 到 posts 表
    • 外键:user_id 到表 users
  • 跟进。表要能够在用户之间建立“跟随”关系。
    • 姓名:如下
    • 字段:following_user_id、followed_user_id
    • 外键:following_user_id 到表 users
    • 外键:followed_user_id 到表 users

下面是创建表的命令

CREATE TABLE users(
    id SERIAL PRIMARY KEY,
    name VARCHAR (50) NOT NULL,
    username VARCHAR (50) UNIQUE NOT NULL,
    password VARCHAR (255) NOT NULL,
    email VARCHAR (255) NOT NULL,
    bio VARCHAR (255) NOT NULL,
    followers INTEGER NOT NULL,
    following INTEGER NOT NULL,
    picture VARCHAR (255) NOT NULL
  )

CREATE TABLE posts(
    id SERIAL PRIMARY KEY,
    title VARCHAR (255) NOT NULL,
    picture VARCHAR (255) NOT NULL,
    description VARCHAR (255) NOT NULL,
    content TEXT NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    likes INTEGER NOT NULL,
    user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE
  )

CREATE TABLE posts_liked_users(
    post_id INTEGER NOT NULL REFERENCES posts(id) ON DELETE CASCADE,
    user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE
  )


CREATE TABLE follows(
    following_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    followed_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE
  )

这是图表:

enter image description here

图表和整体设计是否正确或是否缺少某些内容?

最佳答案

作为对任何遇到类似问题的人的回答,我根据一些建议和研究重构了设计:

  • 我将 VARCHAR 字段更新为 TEXT,这是一般指南。

  • 因为 normalization我删除了 users 中的 followersfollowing 以及 post 中的 likes为了减少data redundancy并改进data integrity .

  • 我在 followsposts_liked_users 上添加了一个 created_at 字段,以记录用户关注另一个帖子或喜欢某个帖子的时间.

CREATE TABLE users(
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL,
  email TEXT NOT NULL,
  bio TEXT NOT NULL,
  picture TEXT NOT NULL
)

CREATE TABLE posts(
  id SERIAL PRIMARY KEY,
  title TEXT NOT NULL,
  picture TEXT NOT NULL,
  description TEXT NOT NULL,
  content TEXT NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE
)

CREATE TABLE posts_liked_users(
  created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  post_id INTEGER NOT NULL REFERENCES posts(id) ON DELETE CASCADE,
  user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE
)

CREATE TABLE follows(
  created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  following_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  followed_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE
)

引用资料:

关于sql - 这个社交媒体平台 PostgreSQL 数据库设计正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62360309/

相关文章:

SQL:如何选择员工的时间范围并按时间间隔30分钟分组

ruby-on-rails - 添加 :on_delete to already existing foreign_key in rails migration

mysql - "Invoice"表在专业数据库中是什么样子的?

postgresql - PostGIS 中的缓冲区(圆形)

python - 如果从数据库中删除相关对象,为什么 Redis 会删除对象中的关系?

sql - 使用 INNER JOIN 从 SQL 转换 UPDATE 以便在 MySQL 中使用

sql - 比较存储过程中的日期时间值

c# - Entity Framework 生成的 SQL 查询

mysql - 替换 MySQL 数据库中的\n\r

php - 我的清理 $_POST[] 函数也清理了土耳其字符