|
|
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, уважаемые формучане :) Вот встал передо мной вопрос, как наиболее "гуманно" реализовать хранение даты. Все бы ничего, если бы не специфичность задачи. А специфика ее вот в чем: необходимо реализовать хранение дат написания литературных произведений. А это значит, что охват происходит от 2000 лет до н.э и по сей день. Порывшись в документации MySQL, я нашел информацию, что поле DATE хранит диапазоны значений от 1000-01-01 до 9999-12-31, что не охватывает необходимый диапазон. При этом не все даты лит. произведений известны точно, а некоторые и вовсе неизвестны. Например "Беовульф" был создан между 8-м и 10- веками. И еще один очень важный момент: по датам будут происходить всевозможные выборки. Вот. Немного пораскинув мозгами я пришел к следующей схеме со своими минусами: в таблице books будет поле типа DATE , которое будет хранить даты произведений, написанных в период от 1000 года по сегодняшний день. Если поле заполненно нулями (0000-00-00), то дата написания неизвестна. Если поле заполнено значением NULL , то дата просто не была введена для этого произведения. Для произведений, написанных раньше 1000 года, сделаем еще одно поле типа SMALLINT , для хранения годов (месяцы и дни здесь уже не нужны, ибо они неизвестны у таких старых произведений). А для того, чтобы реализовать хранение диапазона дат, придется добавить еще одно поле SMALLINT , и при считывании данных проверять его существование. Если оно существует, то речь идет о неточной дате произведения. Вот собственно и все, что мне пришло в голову. Мне такой вариант абсолютно не нравится, но другой придумать я не смог. Буду очень благодарен, за любую полезную информацию или наводку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 02:23:14 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
murtukov, причина, по которой я не хочу хранить даты в UNIX-формате - это не очень гибкая выборка данных. Ну, по крайней мере я так слышал. Своего опыта с этим у меня не так много. Если я не прав, буду рад быть переубежденным) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 02:29:06 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
murtukovпричина, по которой я не хочу хранить даты в UNIX-формате - это не очень гибкая выборка данныхна самом деле причина в том, что авторUNIX-время (англ. Unix time) или POSIX-время — система описания моментов во времени, принятая в UNIX и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг); время с этого момента называют «эрой UNIX» (англ. Unix Epoch).date всё-таки больший интервал охватывает. По-моему, нормально у вас получилось. Только murtukovА для того, чтобы реализовать хранение диапазона дат, придется добавить еще одно поле SMALLINT , и при считывании данных проверять его существование. Если оно существует, то речь идет о неточной дате произведения.я бы туда в случае с известной неточной датой записывал ту же самую дату. Имхо так искать проще. PS. Уверены, что у вас не будет произведений с периодом, который будет задаваться точными датами? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 05:34:07 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
Первый вывод из описания - для хранения требуется два поля. Если известен период - храним начало и конец, если точная дата - оба поля заполняем одним и тем же значением (можно и NULL, но усложнится поиск). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 10:18:21 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
tanglirПо-моему, нормально у вас получилось. Только я бы туда в случае с известной неточной датой записывал ту же самую дату. Имхо так искать проще. Возможно вы опечатались и хотели написать "в случае с известной ТОЧНОЙ датой". То есть, насколько я понял, если известна точная дата, как например 17 апрела 1987, то в обоих полях хранить значение 1987-04-17. При извлечении сравнивать значения, и если они равны, значит известна точная дата написания. Но в таком случае у меня возникают вопросы: - Почему так искать проще? - Не лучше ли хранить NULL, чтобы не занимать лишнюю память? - Стоит ли вообще выделять отдельное поле для этого, ведь произведений с неточной датой единцы. Я думаю второе поле для интервала будет в 99% случаев NULL (ну или таким же как первое, по вашему совету). tanglirPS. Уверены, что у вас не будет произведений с периодом, который будет задаваться точными датами? :) Не уверен :D Просто мне не известны современные произведения, у которых известна только примерная дата написания. Кстати, поле DATE у меня прекрасно хранит диапазон значений от 0000-00-00 до 9999-12-31. И прекрасно отображается. Функции тоже прекрасно работаю. Отрывок из документации: Документация MySQLПоддерживается диапазон величин от '1000-01-01 00:00:00' до '9999-12-31 23:59:59'.(''поддерживается'' означает, что хотя величины с более ранними временными значениями, возможно, тоже будут работать, но нет гарантии того, что они будут правильно храниться и отображаться). Так вот вопрос: стоит ли хранить в типе DATE Значения раньше чем 1000-01-01? Чем это чревато? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 18:19:18 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
Akina, AkinaПервый вывод из описания - для хранения требуется два поля. Если известен период - храним начало и конец, если точная дата - оба поля заполняем одним и тем же значением (можно и NULL, но усложнится поиск). Почему поиск усложнится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 18:25:16 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
Потому что для поиска точной даты и поиска неточной даты придётся делать разные условия. А если хранить равные даты - то в любом случае Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2015, 18:32:35 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
Akina, понял, спасибо. А как же быть с датами до нашэй эры? Получается, надо 4 поля сделать: 2 для диапазона DATE и 2 для более ранних периодов. А не лучше ли вынести старые книги в отдельную таблицу, чтобы не создавать 4 поля, 2 из которых точно будут пустыми? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 05:05:39 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
murtukov, А не проще принять для клиента двоично-десятичный формат даты в японском стиле (ГГГГММДД) и хранить 2 числа для диапазонов в десятичном формате? Там вроде как до 64 цифр и есть знак для "до н.э"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 07:05:41 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
murtukovА как же быть с датами до нашэй эры?Отрицательный год :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 08:59:43 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
AkinamurtukovА как же быть с датами до нашэй эры?Отрицательный год :) Тип DATE ведь не поддерживает отрицательных значений. Что вы имеете ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 13:51:48 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
Arhat109murtukov, А не проще принять для клиента двоично-десятичный формат даты в японском стиле (ГГГГММДД) и хранить 2 числа для диапазонов в десятичном формате? Там вроде как до 64 цифр и есть знак для "до н.э"? Звучит заманчиво, но как это осуществить? Что за двоично-десятичный формат? Какого типа должно быть поле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 13:58:18 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
murtukov, Я бы делал через ООП, абстрактный класс (таблица) "ДАТИРОВАНИЕ", и пару-тройку наследников -- точная дата, диапазон дат, старые даты, и т.п. То, что MySQL не хранит старые даты -- конечно, очень печально, но можно самому хранить отдельно век, год, месяц, день и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 14:19:52 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за ценные советы и почву для размышлений. Отдельное спасибо MasterZiv, думаю так и буду делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 14:41:51 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
murtukovНе уверен :D Просто мне не известны современные произведения, у которых известна только примерная дата написания. Вам известны произведения, у которых известна точная дата написания? Что считается за такую дату? Момент, когда автор поставил последнюю точку? Или когда закончил правку черновика? Или когда отнёс редактору?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 14:51:33 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
как уже выше подсказали, и с условием того, что придется все равно использовать какую то функцию обработки формата хранения проще чем хранить в 6-ти значном INT (YYYYMMDD), ИЛИ 4 значном INT для года ---- не видно С минусом до н.э, все логично и быстро с точки зрения движка MySQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:05:49 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
ну и вариант смещения дат (может быть и самый простой подход) Берем самую нижнюю границу (дату) книги, округлим до тыс.лет. (я думаю 2000 хватит, с учетом диапазона DATE, 2т.лет до н.э. :-)) храним с учетом этого смещения. при запросах учитываем, вот и все. Опять же обработка функцией на клиенте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:13:57 |
|
||
|
Нужен совет по правильной реализации таблицы
|
|||
|---|---|---|---|
|
#18+
murtukovТип DATE ведь не поддерживает отрицательных значений. Что вы имеете ввиду?Я имею в виду простую вещь - не определены все возможные шаблоны поиска. Может же быть поисковый запрос, когда известна дата, но неизвестен год - что станете делать с типом ДАТА? устраивать фуллскан? генерить дополнительный индекс? Пока задача поставлена абстрактно, решения тоже будут абстрактными... А в текстовой форме можно и отрицательный год хранить... или можно воспользоваться советом предыдущего товарища. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2015, 15:35:27 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38867101&tid=1833627]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
73ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 410ms |

| 0 / 0 |
