2014-09-16 2 views
1

Я разрабатываю базу данных для использования с приложением Ruby on Rails. Для данного объекта мне нужно получить доступ к дате события как в формате Gregorian, так и в эквиваленте Hebrew calendar. Я могу легко конвертировать между двумя форматами, но проблема в том, что в календаре на иврите дата меняется на закате, а не в полночь. Поэтому мне нужно либо сохранить две отдельные даты, либо сохранить григорианскую дату и отдельное логическое поле, after_sunset. Затем, когда мне нужно получить доступ к дате на иврите, мне нужно будет запросить оба поля, конвертировать дату, а если after_sunset==true, увеличьте дату.Хранить иврит Даты в базе данных SQL

Какой из этих вариантов считается «лучше»?

И, если я храню дату на иврите отдельно, лучше ли хранить его как строку, целое число или я могу использовать обычную дату?

+0

Итак, для каждого события вы знаете дату и время ее до или после захода солнца, но не точное время или временной интервал? –

+0

Да, это правильно. – SZH

ответ

1

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

С двумя датами вы будете хранить две даты в явной форме. Тем не менее, чтобы согласовать данные, вы должны установить контрольное ограничение, чтобы гарантировать соответствие дат. Это связано с тем, что две даты разделяют часть их информации (избыточность). Это означает, что данные не нормализованы.

По этой причине, чтобы данные были нормализованы в вашей базе данных (и, следовательно, не нужно устанавливать контрольное ограничение для обеспечения согласованности данных), первый подход лучше. Сохраните дату и отметьте флаг после захода солнца.

0

магазин дата в формате UTC, а также сохранять в формате Unix Вы можете использовать функцию преобразования на основе типа Это позволит базы данных для поддержки других форматов времени даты легко в будущем

+0

Мне не нужен какой-либо другой тип календаря. – SZH

0

Если вы не собираетесь назад до рассвета, я думаю, что у меня просто будет многолетняя таблица поиска времен времени UTC и даты иврита, где столбец UTC будет первой секундой дня иврита в конкретном часовом поясе (Greenwich?).

Конверсия является быстрым бинарным поиском,

SELECT hebrew_date FROM hebrew_gregorian_lookup 
WHERE some_input_time >= gregorian_cutoff 
ORDER BY gregorian_cutoff DESC LIMIT 1; 

Если индекс и группироваться таблицей поиска на gregorian_cutoff, он должен быть очень быстрым, даже в течение 100 лет. (Если ваша RDBMS имеет способ заставить таблицу в ОЗУ, еще лучше.) Также в зависимости от вашей РСУБД вы можете обернуть это в функцию/процедуру без потери эффективности.

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

Смежные вопросы