Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 Создать одну таблицу из существующих, есть 4 общие колонки  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
Всем привет! Подскажите, пожалуйста, рецепт для решения следующей задачи:


1. Есть несколько таблиц в которые разные сервисы пишут логи.

2. У всех таблиц есть 4 общие колонки (2 таймстэмпа, 2 варчара)

3. Остальные данные в таблицах отличаются - обычно это несколько вспомогательных полей (простенькие integer, varchar и т.д).

4. Нужно создать архитектуру, чтобы можно было удобно хранить текущие данные в одной таблице, и чтобы можно было добавлять логи новых сервисов (у которых будет похожая структура - 4 общие колонки + несколько дополнительных)

5. На PostgreSQL, объем - порядка 10 млн. записей в день.


Пока думаю сделать 4 общие колонки, а пятую как длинный varchar, в котором через разделитель хранить "ключ-значение" вспомогательных полей. Но это не самое красивое решение, поэтому и задаю этот вопрос :)

Уверен, что кто-то из форумчан с подобной задачей уже сталкивался и может подсказать подходящее решение.
12 авг 19, 21:23    [21947536]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48131

А в чём задача-то, собственно, состоит?

"Объединить таблицы" это не задача, это решение. Кривое и, возможно, неуместное.

Posted via ActualForum NNTP Server 1.5

12 авг 19, 21:45    [21947546]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58418
Блог
sdkmaster
Всем привет! Подскажите, пожалуйста, рецепт для решения следующей задачи:

Гуглите "наследование таблиц". Давно расписаны все возможные варианты вместе с плюсами и минусами каждого.
12 авг 19, 21:57    [21947556]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
Dimitry Sibiryakov
А в чём задача-то, собственно, состоит?

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

Потому что в будущем понадобится хранить логи других сервисов.
Заводить для каждого нового лога отдельную таблицу можно.
Но спустя время можно получить зоопарк из разных таблиц, который трудно поддерживать.

Просто сами логи отличаются лишь вспомогательными полями, которые довольно простые.
Поэтому и поставлена задача - как-то это организовать, чтобы в будущем было удобно работать.
И чтобы можно было добавлять новые логи с минимальными телодвижениями.
12 авг 19, 22:17    [21947567]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
softwarer
sdkmaster
Всем привет! Подскажите, пожалуйста, рецепт для решения следующей задачи:

Гуглите "наследование таблиц". Давно расписаны все возможные варианты вместе с плюсами и минусами каждого.

Спасибо за совет, обязательно почитаю.

Такой вопрос - я собирался делать partition для своей таблицы по дням, чтобы было удобнее бэкапить, удалять и избегать фрагментации.
Наследование таблиц не потащит за собой просадку перформанса или сложности с partition?
12 авг 19, 22:25    [21947572]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
softwarer
sdkmaster
Всем привет! Подскажите, пожалуйста, рецепт для решения следующей задачи:

Гуглите "наследование таблиц". Давно расписаны все возможные варианты вместе с плюсами и минусами каждого.

Этот вариант скорее всего не подойдет.
Здесь нужно заводить отдельную таблицу на каждый новый лог. А как раз этого хочется избежать.

Хочется иметь одну таблицу или может быть связку нескольких. Главное, чтобы ее не надо было менять на каждый новый лог.
И чтобы программист через АПИ мог сторить логи разных сервисов в одном месте.

Сами логи очень похожи друг на друга, отличаются лишь 3-4 колонками с вспомогательной информацией.
Поэтому и хочется найти хорошее, более-менее универсальное решение.
Тем более таблицу(-ы) буду создавать с чистого листа.
12 авг 19, 22:39    [21947578]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48131

sdkmaster
хочется найти хорошее, более-менее универсальное решение.

Уже давно найдено решение: syslog, systemd journal и тому подобное, имя им легион.

Posted via ActualForum NNTP Server 1.5

13 авг 19, 00:17    [21947599]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
Dimitry Sibiryakov
sdkmaster
хочется найти хорошее, более-менее универсальное решение.

Уже давно найдено решение: syslog, systemd journal и тому подобное, имя им легион.

И как ты будешь делать апдейт записи в этом случае?
БД ведь не от нечего делать придумали.

Давай забудем про слово "логи".
Есть несколько таблиц, а в будущем будет больше.
У всех таблиц есть 4 общие колонки.
Своих полей у каждой таблицы 3-4 штуки, и это простые int и короткие varchar.
Хочется все эти таблицы либо объединить в одну, либо создать архитектуру из нескольких связанных между собой таблиц.
Единственное условие - не плодить новые таблицы на каждый новый сервис.
13 авг 19, 08:31    [21947665]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
L_argo
Member

Откуда:
Сообщений: 889
Один из простых вариантов:
4 поля и БЛОБ-поле с произвольными XML-данными внутри.
13 авг 19, 09:50    [21947717]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
L_argo
Один из простых вариантов:
4 поля и БЛОБ-поле с произвольными XML-данными внутри.

Привет! Спасибо за ответ, сам думал насчет этого варианта, только надо еще колонку LogType (integer) добавить, чтобы проще было селектить :)

А что думаешь насчет наследования таблиц?
Вроде пишут, что производительность не страдает, но может сталкивался и знаешь подводные?
13 авг 19, 10:12    [21947741]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 780
sdkmaster,

я бы сделал тупо - четыре общих столбца, столбец типа сервиса, и дополнительные столбцы для сервисов. По дополнительным столбцам. Если есть возможность унифицировать, то хорошо. Если нет, то надо сделать столько столбцов сколько нужно. С одним блобом работать, думаю, проблематично. Вдруг понадобится делать отчёты, запросы. Как разбирать эти блобы? Опять же. Поля можно проиндексировать.
13 авг 19, 10:50    [21947782]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48131

sdkmaster
Хочется все эти таблицы либо объединить в одну, либо создать архитектуру из нескольких
связанных между собой таблиц.
Единственное условие - не плодить новые таблицы на каждый новый сервис.

Тогда как насчёт "плодить новые таблицы на каждый тип сервиса"? Их не будет больше
пары-тройки. Это оптимальное решение по производительности. С общей таблицей ты создашь
бутылочное горлышко по DML.

Posted via ActualForum NNTP Server 1.5

13 авг 19, 11:08    [21947823]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
sdkmaster
Member

Откуда:
Сообщений: 11
Всем привет еще раз!

Пока решили остановиться на наследовании. Это позволит сохранить гибкость, а что самое главное - индексы :)
Если хранить вспомогательные поля в БЛОБе, то мы лишимся тех возможностей, что дает БД.
И как правильно замечено - зачем тогда БД.
Так что придется создавать новые таблицы на каждый новый сервис :(

Всем большое спасибо за ответы!
13 авг 19, 11:23    [21947838]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
L_argo
Member

Откуда:
Сообщений: 889
А что думаешь насчет наследования таблиц?
Для меня это пустой звук, придуманный душевнобольными.
13 авг 19, 13:14    [21948022]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
Riss
Member

Откуда:
Сообщений: 196
Всем привет )) Хоть дело и решенное....
Тоже стараюсь придерживаться линии - как можно меньше таблиц...
Для доп полей можно создать таблицу применительно к примеру id, id_осн таблицы,id_номер сервиса, id номер доп поля сервиса, int,varchar +... поля данных. Реализовывал такое ... работает дешево и сердито. Плодите сколько угодно полей и сервисов. Наименование, описание и остальные характеристики полей, сервисов храните в отдельной таблице.
14 авг 19, 15:34    [21949365]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
vmag
Member

Откуда: MP
Сообщений: 3235
Riss
Для доп полей можно создать таблицу применительно к примеру id, id_осн таблицы,id_номер сервиса, id номер доп поля сервиса, int,varchar +... поля данных. Реализовывал такое ... работает дешево и сердито. Плодите сколько угодно полей и сервисов. Наименование, описание и остальные характеристики полей, сервисов храните в отдельной таблице.


эдакое подобие мини EAV...
14 авг 19, 19:19    [21949576]     Ответить | Цитировать Сообщить модератору
 Re: Создать одну таблицу из существующих, есть 4 общие колонки  [new]
Riss
Member

Откуда:
Сообщений: 196
Как продолжение мысли .... К гадалке не ходи - сервисы по сути идентичны и отличаются подробностями, которые можно описать запросами, которые засунуть в вышесказанную таблицы описания и сделать один сервис ....
15 авг 19, 06:12    [21949733]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить