Ну ты уж определись ;) Каждое из твоих желаний реализуется по разному (если реализовывать нормально).
Я лишь скажу то, что если у тебя по 1 гонке за раз может стартовать, можно грузить их из бд по 1 и не забивать память. Если же их будет много и запускаться они будут по несколько за раз, грузить лучше всё сразу, ибо иначе придётся продумывать систему отлова ложных срабатываний того или иного кода (дабы игроки не флудили запросами в БД, заходя и выходя с гонки и т.п.).
Хотя можно всё на массивах сделать. Зависит от числа этих самых гонок.
Но БД я бы сформировал так:
PHP код:
ID гонки | Номер чекпоинта | Тип чекпоинта | Координата чекпоинта X | Координата чекпоинта Y | Координата чекпоинта Z | Размер чекпоинта
Это самый информативный вариант, но можно убрать информацию о типе чекпоинта и размере, указывая это всё прямо в скрипте (финишем, естественно, будет последний чекпоинт. Поэтому можно при загрузке просто записывать номер последнего чекпоинта и создавать его как финишный. Размер так же вряд ли будет меняться во время гонки, поэтому можно создавать все одинакового размера)
По ID мы делаем запрос (чекпоинты от одной гонки будут под одинаковым ID) и рассортировываем ненужные маркеры от нужных
Номер чекпоинта нам нужен для создания финишного чекпоинта. Да и просто можно будет определить сколько чекпоинтов уже создано + заменить расположение определённого чекпоинта без каких-либо проблем.
Ну а остальное и так понятно, думаю