What are some best practices for structuring MySQL tables to manage user and group notifications in a PHP application?

When managing user and group notifications in a PHP application using MySQL tables, it is important to have a clear database structure to efficiently store and retrieve notification data. One common approach is to have separate tables for users, groups, notifications, and a join table to associate users with notifications. This allows for easy querying and filtering of notifications based on user or group membership.

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL
);

CREATE TABLE groups (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);

CREATE TABLE notifications (
    id INT PRIMARY KEY AUTO_INCREMENT,
    message TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE user_notifications (
    user_id INT,
    notification_id INT,
    PRIMARY KEY (user_id, notification_id),
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (notification_id) REFERENCES notifications(id)
);