База данных для дизайна наилучшей практики лотереи - PullRequest
0 голосов
/ 12 ноября 2018

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

Так как в Excel все включено в электронную таблицу, я хочу сделать некоторую нормализацию для импорта этих данных, мой вопрос состоит в том, правильно ли мой дизайн ориентирован на производительность, и как работать с Group By, я не уверен, но я думаю, что я плохо провалился на последнем.

Мой первоначальный дизайн:

Для результатов:

CREATE TABLE `Game_Results` (
    `Id` int UNSIGNED NOT NULL,
    `Date_Game` date NOT NULL,
    `Ball_01` tinyint UNSIGNED NOT NULL,
    `Ball_02` tinyint UNSIGNED NOT NULL,
    `Ball_03` tinyint UNSIGNED NOT NULL,
    `Ball_04` tinyint UNSIGNED NOT NULL,
    `Ball_05` tinyint UNSIGNED NOT NULL,
    `Ball_06` tinyint UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;

Для получения призовых данных:

CREATE TABLE `Game_Prize` (
    `Game_Id` int UNSIGNED NOT NULL,
    `Total_Bets` decimal UNSIGNED NOT NULL,
    `Winners` smallint UNSIGNED NOT NULL DEFAULT '0',
    `Prize_Per_winner` decimal UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;

Местоположение победителей:

CREATE TABLE `Prize_Location` (
    `Game_Id` int UNSIGNED NOT NULL,
    `State_Prize` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    `City_Prize` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;

Этот дизайн основан на желаемой веб-странице, скажем:

Один div с последним результатом, поэтому запрос будет:

SELECT `Ball_01`, `Ball_02`, `Ball_03`, `Ball_04`, `Ball_05`, `Ball_06` FROM Game_Results WHERE Id IN (SELECT MAX(Id) FROM Game_Results)

И Текущий Идентификатор будет глобальным в php / Javascript

Еще один div на той же странице с информацией о призе, поэтому запрос будет:

 SELECT `Total_Bets`, `Winners`,  `Prize_Per_winner` FROM Game_Prize Where Game_Id = Id (from php / javascript)

Если человек нажмет на Победителей, то откроется модальное окно с данными о местоположении.

На этот раз я могу сделать ВЫБОР на последнем столе и перечислить его, пока проблем нет.

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

  • Что за мяч, который выходит раз за разом?
  • Список упорядоченных шаров по времени выхода.
  • В каком штате побеждает больше людей?
  • Сколько человек выиграло в одном конкретном городе?
  • Etc ..

И проблема с дубликатами, которые выходят с возможностью экспорта результата в PDF или DOCX, я буду искать любой плагин javascript для преобразования JSON на тех, на данный момент, я готов переделать ту же структуру оригинального Excel ( Я знаю о JOINS), пример:

GameID = 55, ..., штат = A, город = A (1 человек)

, ..., штат A, город = A (1 человек)

, ..., штат А, город = A (1 человек)

GameID = 56, ..., штат = C, город = H

GameID = 57, ...,,, (Без победителей)

В оригинальном Excel все находятся в одной строке, перемешивая ячейки для одной и той же игры. Перед символом равенства (GameID, State, City и т. Д.) Располагаются первые строки столбцов, после символа равенства - данные о боттоне, поэтому GameID перемещается по таблице, как GROUP BY.

Итак, как мне быть с последней таблицей ('Prize_Location'), поскольку иногда бывает 3 или 6 победителей?

Я имею в виду, когда-нибудь люди из того же города и штата выиграют, в таком случае, как справиться с этой ситуацией?

И конечно, это лучший способ создать эту базу данных?

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

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018
SELECT `Ball_01`, `Ball_02`, `Ball_03`, `Ball_04`, `Ball_05`, `Ball_06`
    FROM Game_Results WHERE Id IN (SELECT MAX(Id) FROM Game_Results)

лучше сделать так:

SELECT `Ball_01`, `Ball_02`, `Ball_03`, `Ball_04`, `Ball_05`, `Ball_06`
    FROM Game_Results  ORDER BY Id DESC  LIMIT 1

Будьте осторожны с использованием голой DECIMAL.Подумайте об использовании некоторой формы INT для целых чисел.

Упорядочены шары или нет?

Вам следует рассмотреть возможность иметь 6 строк в таблице, предназначенной для шаров, вместо того, чтобы иметь 6 столбцов.Это упростит расчет статистики по номерам шаров.

Я не вижу особой необходимости в нормализации локаций.Просто запишите их в призовую таблицу:

state CHAR(2)     CHARACTER SET ascii,
city  VARCHAR(40) CHARACTER SET ascii

(255 и utf8mb4 не нужны).

Вы можете обнаружить нескольких победителей в городе с помощью:

SELECT city, state, COUNT(*)
    FROM prizes
    GROUP BY city, state
    HAVING COUNT(*) > 1
0 голосов
/ 12 ноября 2018

Один из вариантов может заключаться в переопределении таблицы Prize_Location, чтобы позволить данному Game_Id быть связанным с одним и тем же местоположением более одного раза. Я предлагаю следующее:

CREATE TABLE Prize_Location (
    Game_Id int UNSIGNED NOT NULL,
    Location_Id int NOT NULL
)

CREATE TABLE Locations (
    Id int UNSIGNED NOT NULL,
    State_Prize varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    City_Prize varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
)

Теперь в Prize_Location данное Game_Id может появляться ассоциированным с данным Location_Id более одного раза. Вот как вы представляете данный город и штат, в которых более одного победителя. Вы также можете сделать Game_Id, Location_Id первичным ключом и вместо этого сохранить счетчик, но это кажется более громоздким, чем просто разрешение нескольких записей для данной игры и местоположения.

...