powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужен совет по правильной реализации таблицы
18 сообщений из 18, страница 1 из 1
Нужен совет по правильной реализации таблицы
    #38866124
murtukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые формучане :)

Вот встал передо мной вопрос, как наиболее "гуманно" реализовать хранение даты. Все бы ничего, если бы не специфичность задачи.
А специфика ее вот в чем: необходимо реализовать хранение дат написания литературных произведений. А это значит, что охват происходит от 2000 лет до н.э и по сей день. Порывшись в документации MySQL, я нашел информацию, что поле DATE хранит диапазоны значений от 1000-01-01 до 9999-12-31, что не охватывает необходимый диапазон. При этом не все даты лит. произведений известны точно, а некоторые и вовсе неизвестны. Например "Беовульф" был создан между 8-м и 10- веками.
И еще один очень важный момент: по датам будут происходить всевозможные выборки. Вот.

Немного пораскинув мозгами я пришел к следующей схеме со своими минусами: в таблице books будет поле типа DATE , которое будет хранить даты произведений, написанных в период от 1000 года по сегодняшний день. Если поле заполненно нулями (0000-00-00), то дата написания неизвестна. Если поле заполнено значением NULL , то дата просто не была введена для этого произведения.
Для произведений, написанных раньше 1000 года, сделаем еще одно поле типа SMALLINT , для хранения годов (месяцы и дни здесь уже не нужны, ибо они неизвестны у таких старых произведений). А для того, чтобы реализовать хранение диапазона дат, придется добавить еще одно поле SMALLINT , и при считывании данных проверять его существование. Если оно существует, то речь идет о неточной дате произведения.

Вот собственно и все, что мне пришло в голову. Мне такой вариант абсолютно не нравится, но другой придумать я не смог.
Буду очень благодарен, за любую полезную информацию или наводку.
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38866126
murtukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
murtukov,

причина, по которой я не хочу хранить даты в UNIX-формате - это не очень гибкая выборка данных. Ну, по крайней мере я так слышал. Своего опыта с этим у меня не так много. Если я не прав, буду рад быть переубежденным)
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38866147
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
murtukovпричина, по которой я не хочу хранить даты в UNIX-формате - это не очень гибкая выборка данныхна самом деле причина в том, что авторUNIX-время (англ. Unix time) или POSIX-время — система описания моментов во времени, принятая в UNIX и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг); время с этого момента называют «эрой UNIX» (англ. Unix Epoch).date всё-таки больший интервал охватывает.

По-моему, нормально у вас получилось. Только
murtukovА для того, чтобы реализовать хранение диапазона дат, придется добавить еще одно поле SMALLINT , и при считывании данных проверять его существование. Если оно существует, то речь идет о неточной дате произведения.я бы туда в случае с известной неточной датой записывал ту же самую дату. Имхо так искать проще.

PS. Уверены, что у вас не будет произведений с периодом, который будет задаваться точными датами? :)
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38866300
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый вывод из описания - для хранения требуется два поля. Если известен период - храним начало и конец, если точная дата - оба поля заполняем одним и тем же значением (можно и NULL, но усложнится поиск).
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867075
murtukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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? Чем это чревато?
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867085
murtukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

AkinaПервый вывод из описания - для хранения требуется два поля. Если известен период - храним начало и конец, если точная дата - оба поля заполняем одним и тем же значением (можно и NULL, но усложнится поиск).

Почему поиск усложнится?
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867101
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что для поиска точной даты и поиска неточной даты придётся делать разные условия. А если хранить равные даты - то в любом случае
Код: sql
1.
WHERE :date BETWEEN DateForm AND DateTo
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867345
murtukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

понял, спасибо. А как же быть с датами до нашэй эры? Получается, надо 4 поля сделать: 2 для диапазона DATE и 2 для более ранних периодов. А не лучше ли вынести старые книги в отдельную таблицу, чтобы не создавать 4 поля, 2 из которых точно будут пустыми?
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867359
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
murtukov,

А не проще принять для клиента двоично-десятичный формат даты в японском стиле (ГГГГММДД) и хранить 2 числа для диапазонов в десятичном формате? Там вроде как до 64 цифр и есть знак для "до н.э"?
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867396
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
murtukovА как же быть с датами до нашэй эры?Отрицательный год :)
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867742
murtukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinamurtukovА как же быть с датами до нашэй эры?Отрицательный год :)

Тип DATE ведь не поддерживает отрицательных значений. Что вы имеете ввиду?
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867751
murtukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109murtukov,

А не проще принять для клиента двоично-десятичный формат даты в японском стиле (ГГГГММДД) и хранить 2 числа для диапазонов в десятичном формате? Там вроде как до 64 цифр и есть знак для "до н.э"?
Звучит заманчиво, но как это осуществить? Что за двоично-десятичный формат? Какого типа должно быть поле?
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867791
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
murtukov,

Я бы делал через ООП, абстрактный класс (таблица) "ДАТИРОВАНИЕ", и пару-тройку наследников -- точная дата, диапазон дат,
старые даты, и т.п.

То, что MySQL не хранит старые даты -- конечно, очень печально, но можно самому хранить
отдельно век, год, месяц, день и т.п.
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867816
murtukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за ценные советы и почву для размышлений.
Отдельное спасибо MasterZiv, думаю так и буду делать.
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867829
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
murtukovНе уверен :D Просто мне не известны современные произведения, у которых известна только примерная дата написания.
Вам известны произведения, у которых известна точная дата написания? Что считается за такую дату? Момент, когда автор поставил последнюю точку? Или когда закончил правку черновика? Или когда отнёс редактору?..
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867855
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как уже выше подсказали,
и с условием того, что придется все равно использовать какую то функцию обработки формата хранения
проще чем хранить в 6-ти значном INT (YYYYMMDD), ИЛИ 4 значном INT для года ---- не видно
С минусом до н.э, все логично и быстро с точки зрения движка MySQL
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867866
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и вариант смещения дат (может быть и самый простой подход)
Берем самую нижнюю границу (дату) книги, округлим до тыс.лет. (я думаю 2000 хватит, с учетом диапазона DATE, 2т.лет до н.э. :-))
храним с учетом этого смещения.
при запросах учитываем, вот и все. Опять же обработка функцией на клиенте
...
Рейтинг: 0 / 0
Нужен совет по правильной реализации таблицы
    #38867892
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
murtukovТип DATE ведь не поддерживает отрицательных значений. Что вы имеете ввиду?Я имею в виду простую вещь - не определены все возможные шаблоны поиска. Может же быть поисковый запрос, когда известна дата, но неизвестен год - что станете делать с типом ДАТА? устраивать фуллскан? генерить дополнительный индекс? Пока задача поставлена абстрактно, решения тоже будут абстрактными...
А в текстовой форме можно и отрицательный год хранить... или можно воспользоваться советом предыдущего товарища.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужен совет по правильной реализации таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]