Нужно спроектировать продуманную структуру бд для системы ролей. Используется nodeJS с pg и discord.js.
Если кратко по командам: Можно дать роль навсегда/временно снять роль, удалить иконку, поставить иконку, выставить на маркет, изменить цену, снять с маркета, продлить, переименовать, изменить цвет, удалить роль.
Мне нужно от вас знания и опыт в области проектирования баз данных, текущая структура - это прототип и если даже не получится сделать всё идеально, то было бы неплохо чтобы при удалении роли через кнопку или cron который будет раз в час сравнивать с текущей датой столбец role_expiry_date из таблицы roles, то удалялись и все записи связанные с ней.
Если чего-то не хватает для понимания всех картины в целом - пишите, добавлю. Также возможны доп. вопросы от меня по ходу например: разбиение существующих таблиц на под таблицы.
Текущая структура(некоторые таблицы вырезал, но они вообще никак не относятся к ролям):
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
username VARCHAR(32)
);
CREATE TABLE IF NOT EXISTS role_keys (
keys TEXT NOT NULL,
expiry_date TIMESTAMP DEFAULT NULL,
creation_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS user_balance (
user_id TEXT PRIMARY KEY REFERENCES users(id),
coins BIGINT DEFAULT 0,
shards BIGINT DEFAULT 0
);
CREATE TABLE IF NOT EXISTS timely_last_claim_time (
id TEXT PRIMARY KEY REFERENCES user_balance(user_id),
claim_time TIMESTAMP DEFAULT (CURRENT_TIMESTAMP - INTERVAL '24 HOURS')
);
CREATE TABLE IF NOT EXISTS transactions (
id SERIAL PRIMARY KEY,
user_id TEXT,
source_type VARCHAR(50),
source_id TEXT,
amount BIGINT,
commission BIGINT,
comment TEXT,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS roles (
id SERIAL PRIMARY KEY,
role_id TEXT PRIMARY KEY,
user_id TEXT PRIMARY KEY,
role_name VARCHAR(32) NOT NULL,
role_color TEXT,
role_expiry_date TIMESTAMP,
icon_url TEXT,
creation_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS roles_inventory (
user_id TEXT REFERENCES roles(id),
role_id TEXT REFERENCES roles(role_id),
is_active_hide BOOLEAN DEFAULT true,
buy_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expiry_date TIMESTAMP DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS roles_shop (
id SERIAL PRIMARY KEY,
user_id TEXT REFERENCES roles(user_id),
role_id TEXT REFERENCES roles(role_id),
buy_count INTEGER DEFAULT 0,
price INTEGER DEFAULT 100,
);
CREATE TABLE IF NOT EXISTS roles_shop_flag (
table_id TEXT REFERENCES roles(id),
flag BOOLEAN DEFAULT false
);