@okimjuh

Как сделать базу для системы ролей наиболее наиболее «правильно» по всем стандартам?

Нужно спроектировать продуманную структуру бд для системы ролей. Используется 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
);
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы