1
Исследовательская лаборатория / Re: Инструменты. База данных
« : Июля 30, 2020, 10:51:18 »
Некоторые комментарии к схеме.
1. Поля Gap, Speed и FLSpeed в таблице raceresults на первый взгляд могут показаться избыточными - ведь очень легко рассчитать отставание от победителя, среднюю скорость и скорость быстрейшего круга прямо в ходе формирования запроса, опираясь на данные о дистанции, длине круга и времени участников. Но я работаю чаще всего с неполными данными (главным образом из публикаций в газетах и журналах). Например, указана средняя скорость (к тому же очень приблизительно, округленная до 1 км/ч), но при этом протяженность дистанции неизвестна. Вот и приходится заводить избыточные поля в таблице.
2. Разделение дней, месяцев и годов в таблице drivers - также вынужденный шаг по причине неполноты информации. Чаще всего известен только год рождения или смерти спортсмена; в некоторых анкетах участников я встречал только год и месяц рождения без указания числа. А формат даты в Paradox не позволяет оставлять часть даты пустой или вводить значения вроде 00.00.1956. Вот и пришлось разделить каждую дату на три поля. Для таблицы events аналогичный вопрос не стоит, так как дата проведения соревнований известна в 90% случаев точно, а в остальных случаях ее можно вычислить по косвенным данным (например, по дате выхода газет, в которых есть заметки об этих соревнованиях).
3. Поле Sex по логике строения базы данных должно было бы находиться в таблице drivers, но дело в том, что сведений о гонщиках, выходящих за рамки имени и фамилии, у меня мало. Получается, что в таблице drivers содержится имен намного меньше, чем встречается в raceresults (на данный момент - 1943 и 3518 соответственно). Так что если вдруг потребуется выборка данных о женщинах в гонках, я полезу прежде всего в результаты гонок. А значит, полю Sex место именно в этой таблице.
4. В таблице teamresults хранятся командные результаты как отдельных соревнований, так и многоэтапных чемпионатов. В обоих случаях записи имеют одинаковую структуру: место, команда, сумма очков, члены команды. Поэтому проще оказалось свести все это в одну таблицу и связать ее как с events, так и с championships. При запросе командных результатов отдельных соревнований отбор идет по полю IDEvent, а при запросе командных результатов многоэтапного чемпионата - по полю IDChampionship.
5. Наличие поля Reliability в таблице chresults вызвано тем, что иногда я сам рассчитываю суммы очков по имеющимся результатам гонок, если в моем распоряжении нет официальных итогов чемпионата. В этих-то случаях и ставится пометка "недостоверно" в поле Reliability (точнее, поле имеет логический тип, то есть значение устанавливается равным false, а в СУБД для удобства используется выпадающий список с пунктами "достоверно" и "недостоверно").
6. Стартовая решетка кодируется следующим образом: через дефис два числа и буква. Первое число - количество мест в нечетных рядах, второе - количество мест в четных рядах, буква обозначает направление счета мест в рядах: "л" - слева направо, "п" - справа налево. Например, на Невском кольце традиционно стартовое поле соответствовало схеме "4-3-п".
7. Здесь в структурах таблицах lapcharts и laptimes для экономии места сведены вместе однотипные поля с данными о номерах участников и результатах на круге. На самом деле в lapcharts тридцать пять таких полей, а в laptimes - тридцать. Если попадется какая-нибудь гонка с числом кругов более тридцати, для которой известны результаты отдельных кругов, количество полей может еще увеличиться.
1. Поля Gap, Speed и FLSpeed в таблице raceresults на первый взгляд могут показаться избыточными - ведь очень легко рассчитать отставание от победителя, среднюю скорость и скорость быстрейшего круга прямо в ходе формирования запроса, опираясь на данные о дистанции, длине круга и времени участников. Но я работаю чаще всего с неполными данными (главным образом из публикаций в газетах и журналах). Например, указана средняя скорость (к тому же очень приблизительно, округленная до 1 км/ч), но при этом протяженность дистанции неизвестна. Вот и приходится заводить избыточные поля в таблице.
2. Разделение дней, месяцев и годов в таблице drivers - также вынужденный шаг по причине неполноты информации. Чаще всего известен только год рождения или смерти спортсмена; в некоторых анкетах участников я встречал только год и месяц рождения без указания числа. А формат даты в Paradox не позволяет оставлять часть даты пустой или вводить значения вроде 00.00.1956. Вот и пришлось разделить каждую дату на три поля. Для таблицы events аналогичный вопрос не стоит, так как дата проведения соревнований известна в 90% случаев точно, а в остальных случаях ее можно вычислить по косвенным данным (например, по дате выхода газет, в которых есть заметки об этих соревнованиях).
3. Поле Sex по логике строения базы данных должно было бы находиться в таблице drivers, но дело в том, что сведений о гонщиках, выходящих за рамки имени и фамилии, у меня мало. Получается, что в таблице drivers содержится имен намного меньше, чем встречается в raceresults (на данный момент - 1943 и 3518 соответственно). Так что если вдруг потребуется выборка данных о женщинах в гонках, я полезу прежде всего в результаты гонок. А значит, полю Sex место именно в этой таблице.
4. В таблице teamresults хранятся командные результаты как отдельных соревнований, так и многоэтапных чемпионатов. В обоих случаях записи имеют одинаковую структуру: место, команда, сумма очков, члены команды. Поэтому проще оказалось свести все это в одну таблицу и связать ее как с events, так и с championships. При запросе командных результатов отдельных соревнований отбор идет по полю IDEvent, а при запросе командных результатов многоэтапного чемпионата - по полю IDChampionship.
5. Наличие поля Reliability в таблице chresults вызвано тем, что иногда я сам рассчитываю суммы очков по имеющимся результатам гонок, если в моем распоряжении нет официальных итогов чемпионата. В этих-то случаях и ставится пометка "недостоверно" в поле Reliability (точнее, поле имеет логический тип, то есть значение устанавливается равным false, а в СУБД для удобства используется выпадающий список с пунктами "достоверно" и "недостоверно").
6. Стартовая решетка кодируется следующим образом: через дефис два числа и буква. Первое число - количество мест в нечетных рядах, второе - количество мест в четных рядах, буква обозначает направление счета мест в рядах: "л" - слева направо, "п" - справа налево. Например, на Невском кольце традиционно стартовое поле соответствовало схеме "4-3-п".
7. Здесь в структурах таблицах lapcharts и laptimes для экономии места сведены вместе однотипные поля с данными о номерах участников и результатах на круге. На самом деле в lapcharts тридцать пять таких полей, а в laptimes - тридцать. Если попадется какая-нибудь гонка с числом кругов более тридцати, для которой известны результаты отдельных кругов, количество полей может еще увеличиться.