@skoch244

Как лучше сохранять дату и время?

Как лучше сохранять дату и время в базе где много таблиц и в каждой она есть, небольшой пример: есть несколько источников температур (T) и давлений (P), мы собираем с них информацию в разные таблицы, а дату и время этих показаний T и P можем сохранять в те же таблицы или создать общий справочник, в котором будет записываться дата и время, а уже таблицы с показаниями будут ссылаться на них, то есть создать справочник с датой и временем.
база со справочником
61e1163c246c1815599872.png

spoiler
61e11646d2cd9214655414.png

Какие я вижу плюсы: это понятное присоединение таблиц (join), нормализация. В дальнейшем хотелось бы отсечь старые данные секционированием, но не совсем понимаю как это сделать с данной архитектурой.
  • Вопрос задан
  • 241 просмотр
Пригласить эксперта
Ответы на вопрос 5
firedragon
@firedragon
Senior .NET developer
Есть встроенный тип времени и даты и даже не один. Используйте его, а не костыли.

INT -231 (-2,147,483,648) to 231-1 (2,147,483,647) 4 Bytes
DATETIME 8 bytes
7 * 4 = 28 это одна ваша запись оверхед в 20 байтов.
Плюс по вашим данным нельзя искать используя встроенные функции и операторы, в общем реальная дичь.

Кстати что натолкнуло на такую конструкцию?
Ответ написан
LaRN
@LaRN
Senior Developer
Если таблицы будут большими по числу записей, то любое связывание это уже минус, т.к. Join это по сути вложенный цикл и даже если во второй таблице есть индекс все равно это дороже чем один раз пройтись и отобрать записи по одной таблице, где есть поле дата.

С точки зрения размера базы, с одной таблицей будет компактнее.

Если требуется секционирование, то поле для секционирующей функции д.б. частью. секционируемой таблицы.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
вот я тоже не понял, в чем смысл этого "справочника"

А справочник для цифр не хотите ввести? Ну там к примеру датчик показывает 200 миллизюзиков
вы пишете 200 не в таблицу с показаниями, а берете её из справочника показаний, а в таблице с показаниями делается ссылка на это значение.
А можно ещё сделать справочник цифр от 0 до 9, и присоединить его как многие ко многим. Сделать промежуточную таблицу, в которую записать ссылки на цифры 2, 0 и 0. И получить 200 через "понятное присоединение таблиц (join)"!
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
Дата в описанном случае - это не отдельная сущность-свойство сущности Измерение, а атрибут экземпляра этой сущности.

Соответственно "справочник дат" - дурь, не имеющая права на существование.

Для хранения дат в любой СУБД есть соответствующие встроенные типы (их, как правило, не один). Хранение значения даты "кусками" - точно такая же не имеющая право на существование дурь. До тех пор пока выделяемые в отдельные поля компоненты этой даты не являются самостоятельной сущностью. Но в этом случае вычисляемое поле скорее всего будет более разумным решением.
Ответ написан
Комментировать
@Vitsliputsli
Вариант с таблицей дат, вы вероятно подсмотрели где-то, где в одной таблице хранятся агрегаты разной гранулярности. Только в этом случае такие манипуляции имеют смысл. Но хорошим я бы такое решение все равно не назвал бы. Сделать несколько таблиц агрегатов выгоднее, чем все свалить в кучу и потом терять в чтении и записи, на манипуляции с дополнительной таблицей. Или еще лучше, запихнуть все в колоночное хранилище, которое само будет управлять агрегатами.
Но вы ведь вообще не агрегаты собираете, а просто данные, так что все это ни к чему.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы