От Hokum Ответить на сообщение
К apple16 Ответить по почте
Дата 25.04.2007 17:56:37 Найти в дереве
Рубрики Флот; Память; Версия для печати

Re: Продолжение

С датами есть несколько тонких моментов.
1. Все даты должны быть конвертированы в тип данных "дата/время" (datetime, smalldatetime, etc). Сравнивать строки с датами ни одна база на умеет (точнее умеет, но с непредсказуемым результатом :-))
2. Все даты должны быть приведены к единому стандарту. Никаких старых и новых стилей. Хоть от сотворения мира, хоть со дня рождения Джорджа Буша - но единообразно.
3. То же самое со временем. Хоть по Токио, хоть по Шанхаю - но в едином стандарте для всей базы.
4. И самое главное. Ни одна база не понимает неполных дат (вот бы где пригодилась троичная логика). То есть, к примеру, дата "1904 год" будет автоматически преобразована в "1 января 1904 года, 00 часов 00 минут 00 секунд". При этом в принципе невозможно установить, какая часть даты введена пользователем, а какакя сгенерирована сервером.
Вот одно из возможных решений. Не идеальное, во многом избыточное - но работать будет.
Итак:
1. Из основных таблиц убираются все поля типа "дата/время". Никаких "родился - женился - крестился - спущен на воду - продан на слом - съеден аборигенами".
2. Все подобные эпизоды хранятся как события в таблице "хронология". Событие - это любой эпизод, имеющий временную привязку. Спуск на воду крейсера "Баян", рождение адмирала Нельсона, женитьба прапорщика Ранцева на баронессе фон Засс...
3. Событие имеет одну временную отметку. Если требуется хранить какой-то интервал, событие разбивается на несколько отдельных событий. К примеру, бой Желтом море будет представлен десятком-другим событий, а вот выпуск гардемарина Ливитина мичманом - одним (пусть они хоть трое суток гудели по этому поводу :-))
4. Для каждого события в базе хранится:
- ключи ко всем вовлеченным в него сущностям (люди, корабли, флоты и т.п.) через систему промежуточных таблиц,
- дата и время события, пересчитанные в универсальный формат (скажем, григорианский календарь, время по Гринвичу),
- флаги достоверности для всех частей даты (скажем, год и месяц - достоверно, день и час - недостоверно),
- оригинальное представление даты или интервала в текстовом виде (для контроля, при запросах не используется),
- ссылка на источник.
Вот так или примерно так.
С уважением,
Роман