Схема метагейма MTG

Итак, есть еще один вопрос о хранении информации об карточной игре, но в моей ситуации мне нужно хранить не только необработанную информацию о турнире, но и множество статистических данных, которые я извлек из нее:

Веб-парсер> База данных SQL

Турниры

  • Формат (доступны разные коллекции карточек)
  • Тип соревнования (это турнир на выбывание?)
  • Дата, когда это произошло

Колоды

  • Карты в них (в каждой колоде есть две группы карт: основная и боковая)
  • Турнир это произошло в
  • Победы и проигрыши

База данных SQL> Анализ данных> База данных SQL

Архетипы (группа похожих колод, также называемая кластерами)

  • Карты, которые очень часто появляются в архетипе
  • Значительные матчи против других архетипов, иначе говоря, колоды, против которых он обычно выигрывает или проигрывает.
  • Колода, которая является наиболее репрезентативной для всего архетипа
  • Подобные архетипы

Открытки

  • Архетипы это чаще всего
  • Сколько колод, независимо от архетипа, его используют
  • Карты, с которыми он обычно встречается

Основная трудность моей модели базы данных заключается в том, что существует множество ловушек отношений «многие ко многим», которых мне нужно избегать. Без лишних слов, вот код:

CREATE TABLE tournaments (
    id SERIAL PRIMARY KEY,
    format VARCHAR,
    gametype VARCHAR,
    date DATE
);

CREATE TABLE decks (
    id SERIAL PRIMARY KEY,
    tournament INTEGER REFERENCES tournaments(id) ON DELETE CASCADE,
    mainboard VARCHAR[],
    sideboard VARCHAR[],
);

CREATE TABLE games (
    winner INTEGER REFERENCES decks(id) ON DELETE CASCADE,
    loser INTEGER REFERENCES decks(id) ON DELETE CASCADE,
);

CREATE TABLE clusters (
    id SERIAL PRIMARY KEY,
    mainboard VARCHAR[],
    sideboard VARCHAR[],
    highlights VARCHAR[],
    size INTEGER
);

CREATE TABLE significantmatchups (
    winner INTEGER REFERENCES clusters(id) ON DELETE CASCADE,
    loser INTEGER REFERENCES clusters(id) ON DELETE CASCADE,
    winrate DECIMAL
);

CREATE TABLE similarclusters (
    clustera INTEGER REFERENCES clusters(id) ON DELETE CASCADE,
    clusterb INTEGER REFERENCES clusters(id) ON DELETE CASCADE,
    distance INTEGER
);

CREATE TABLE highlightcards (
    cluster INTEGER REFERENCES clusters(id) ON DELETE CASCADE,
    card INTEGER REFERENCES cards(id) ON DELETE CASCADE,
    frequency DECIMAL
);

CREATE TABLE cards (
    id SERIAL PRIMARY KEY,
    name VARCHAR PRIMARY KEY,
    decks INTEGER,
    usedin INTEGER[]
);

CREATE TABLE similarcards (
    carda INTEGER REFERENCES cards(id) ON DELETE CASCADE,
    cardb INTEGER REFERENCES cards(id) ON DELETE CASCADE,
    cooccurences INTEGER
);

Я пропустил избыточность? Что я могу улучшить?

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *