这个社交媒体平台 PostgreSQL 数据库设计正确吗?
Is this Social Media Platform PostgreSQL Database design right?
这是一个简单的社交媒体平台的持久化设计。目前,有这些 tables:
- 用户:数据库的主要 table,其中包含在我们的应用程序中注册的用户的信息。将存储在此 table 中的数据将是名称
- 姓名:用户
- 字段:id、姓名、用户名、密码、电子邮件、个人简介、关注者、关注对象、图片。
- 主键:id
- Posts:数据库 table 包含来自所有用户的所有 posts。每个 post 将包含 post 的标题、描述和主要内容。
- 姓名:posts
- 字段:id、标题、图片、描述、内容,created_at,喜欢,user_id。
- 主键:id
- 外键:user_id 给 table 用户
- Post 被用户点赞:一个 table 定义了多个 post 点赞和点赞他们的用户之间的多对多关系。
- 姓名:posts_liked_users
- 字段:post_id、user_id
- 外键:post_id 到 table posts
- 外键:user_id 给 table 用户
- 关注。 Table 能够在用户之间建立 "following" 关系。
- 姓名:关注
- 字段:following_user_id、followed_user_id
- 外键:following_user_id 至 table 用户
- 外键:followed_user_id 到 table 用户
这是创建 tables
的命令
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
)
这是图表:
图表和整体设计是否正确或是否缺少某些内容?
作为对任何遇到类似问题的人的回答,我根据一些建议和研究重构了设计:
我将 VARCHAR
字段更新为 TEXT
,这是一般指南。
因为normalization I removed the followers
and following
from the users
and likes
from the post
in order to reduce data redundancy and improve data integrity.
我在 follows
和 posts_liked_users
上添加了一个 created_at
字段,以记录用户关注另一个人或喜欢 post 的时间。
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
)
参考文献:
- 的评论
PostgreSQL: Difference between text and varchar (character varying)
Any downsides of using data type "text" for storing strings?
-
这是一个简单的社交媒体平台的持久化设计。目前,有这些 tables:
- 用户:数据库的主要 table,其中包含在我们的应用程序中注册的用户的信息。将存储在此 table 中的数据将是名称
- 姓名:用户
- 字段:id、姓名、用户名、密码、电子邮件、个人简介、关注者、关注对象、图片。
- 主键:id
- Posts:数据库 table 包含来自所有用户的所有 posts。每个 post 将包含 post 的标题、描述和主要内容。
- 姓名:posts
- 字段:id、标题、图片、描述、内容,created_at,喜欢,user_id。
- 主键:id
- 外键:user_id 给 table 用户
- Post 被用户点赞:一个 table 定义了多个 post 点赞和点赞他们的用户之间的多对多关系。
- 姓名:posts_liked_users
- 字段:post_id、user_id
- 外键:post_id 到 table posts
- 外键:user_id 给 table 用户
- 关注。 Table 能够在用户之间建立 "following" 关系。
- 姓名:关注
- 字段:following_user_id、followed_user_id
- 外键:following_user_id 至 table 用户
- 外键:followed_user_id 到 table 用户
这是创建 tables
的命令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
)
这是图表:
图表和整体设计是否正确或是否缺少某些内容?
作为对任何遇到类似问题的人的回答,我根据一些建议和研究重构了设计:
我将
VARCHAR
字段更新为TEXT
,这是一般指南。因为normalization I removed the
followers
andfollowing
from theusers
andlikes
from thepost
in order to reduce data redundancy and improve data integrity.我在
follows
和posts_liked_users
上添加了一个created_at
字段,以记录用户关注另一个人或喜欢 post 的时间。
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
)
参考文献:
- 的评论
PostgreSQL: Difference between text and varchar (character varying)
Any downsides of using data type "text" for storing strings?