Итак, есть еще один вопрос о хранении информации об карточной игре, но в моей ситуации мне нужно хранить не только необработанную информацию о турнире, но и множество статистических данных, которые я извлек из нее:
Веб-парсер> База данных 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
);
Я пропустил избыточность? Что я могу улучшить?
