Medium Clone
Complete database schema for a Medium-like online publishing platform featuring user profiles, publication management with member roles, article publishing with rich metadata, nested response threads, clap reaction system, bookmarks, user and publication follows, reading lists, personalized notifications, and paid subscription management.
bloggingpublishingarticlesmedium
MySQL10 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, globally unique user identifier
Unique username used in profile URL and mentions
User email for authentication and notifications
Hashed password, nullable to support OAuth-only accounts
Full name displayed on the user profile and article bylines
Short biography shown on the writer profile page
URL to the user profile picture
Denormalized count of users following this writer
Timestamp when the account was created
Timestamp when the account was last modified
IXUQCK|💬
MySQL9 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, globally unique publication identifier
FK to users: the user who created and manages the publication
Display name of the publication
URL-safe unique slug used in the publication URL path
Short description of the publication editorial focus
URL to the publication logo image
Denormalized count of users following this publication
Timestamp when the publication was created
Timestamp when the publication was last updated
IXUQCK|💬
MySQL5 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique publication membership identifier
FK to publications: the publication this member belongs to
FK to users: the member user
Member role in the publication: owner, editor, or writer
Timestamp when the user joined the publication
IXUQCK|💬
MySQL3 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique tag identifier
Unique tag name used for article discovery (e.g. Technology, Design)
Timestamp when the tag was first created on the platform
IXUQCK|💬
MySQL16 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, globally unique article identifier
FK to users: the user who wrote and published the article
FK to publications: the publication the article is submitted to
Article title shown in listings and search results
Optional subtitle displayed below the article title
URL-safe unique slug identifying the article in its URL
Full article body content in HTML or JSON editor format
URL to the cover image shown at the top of the article
Estimated reading time in minutes calculated from word count
Article publication status: draft, published, or unlisted
Whether the full article is restricted to paying members
Denormalized total clap count received from all readers
Total number of times the article has been viewed
Timestamp when the article was published
Timestamp when the article draft was first created
Timestamp when the article was last modified
IXUQCK|💬
MySQL4 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique article-tag association identifier
FK to articles: the article being tagged
FK to tags: the tag applied to the article
Timestamp when the tag was applied to the article
IXUQCK|💬
MySQL8 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, globally unique response identifier
FK to articles: the article this response was written about
FK to users: the user who wrote the response
FK to responses: parent response for nested replies, null for top-level
Text content of the response to the article or another response
Total claps received by this response from readers
Timestamp when the response was published
Timestamp when the response was last edited
IXUQCK|💬
MySQL5 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique article clap record identifier
FK to articles: the article that received the claps
FK to users: the reader who gave claps
Number of claps given by this user (1 to 50)
Timestamp when the clap was recorded
IXUQCK|💬
MySQL5 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique response clap record identifier
FK to responses: the response that received the claps
FK to users: the reader who gave claps to the response
Number of claps given by this user to the response
Timestamp when the clap was recorded
IXUQCK|💬
MySQL4 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique bookmark record identifier
FK to users: the user who bookmarked the article
FK to articles: the article that was bookmarked
Timestamp when the article was bookmarked
IXUQCK|💬
MySQL4 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique user follow record identifier
FK to users: the user who is following
FK to users: the writer being followed
Timestamp when the follow relationship was created
IXUQCK|💬
MySQL5 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique reading list identifier
FK to users: the user who owns this reading list
FK to articles: the article added to the reading list
Optional name of the custom list the article was added to
Timestamp when the article was added to the reading list
IXUQCK|💬
MySQL8 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique notification identifier
FK to users: the user who receives the notification
FK to users: the user who triggered the notification event
Notification type: clap, follow, response, or new_article
Type of entity related to the notification: article or response
UUID of the article or response that triggered the notification
Whether the user has viewed or dismissed the notification
Timestamp when the notification was generated
IXUQCK|💬
MySQL7 cols
Num
PK
AI
FK
Null
Physical Name
Type
Default
Comment
Primary key, unique subscription record identifier
FK to users: the user on this subscription plan
Subscription plan: free or member
Subscription status: active, canceled, or past_due
End of the current billing period before renewal or expiry
Timestamp when the subscription was first created
Timestamp when the subscription record was last updated
IXUQCK|💬
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.
Created with ERD Studio
Tables in this template
usersUsers
10 colspublicationsPublications
9 colspublication_membersPublication Members
5 colstagsTags
3 colsarticlesArticles
16 colsarticle_tagsArticle Tags
4 colsresponsesResponses
8 colsarticle_clapsArticle Claps
5 colsresponse_clapsResponse Claps
5 colsbookmarksBookmarks
4 colsuser_followsUser Follows
4 colsreading_listReading List
5 colsnotificationsNotifications
8 colssubscriptionsSubscriptions
7 colsRelated Templates
View all templates →GitHub
CloneCode hosting platform with repositories, issues, pull requests, and CI/CD
PostgreSQL16 tables
developer-toolsgitcollaboration+2
Web App
Netflix
CloneVideo streaming platform with content catalog, profiles, subscriptions, and recommendations
PostgreSQL15 tables
streamingvideosubscription+2
Web App
Spotify
CloneMusic streaming platform with tracks, artists, albums, playlists, and social features
PostgreSQL18 tables
musicstreamingplaylist+2
Web App
Discord
CloneCommunity platform with servers, channels, roles, voice, and bots
PostgreSQL15 tables
gamingcommunityvoice+2
Web App