LINUX.ORG.RU

Вопрос про дилемму в разработке систем хранения данных. По какому пути пойти? СУБД, таблицы, C++, треш, угар.

 


1

3

Сложно-философский вопрос. Не будем рассматривать транзакции и какую-либо связь между таблицами, то есть не будет слова «реляционные (нет реляций между)». Рассмотрим просто таблицу. Таблица - набор строк, каждая строка - набор строго типизированных колонок. Хранит данные - построчно или поколоночно - неважно - зависит от задачи чтения. Главное, что таблица.

Утверждение: в форму таблицы впихивается очень существенное число разных данных. А которые не впихиваются - впихиваются при допиле движка таблиц специальными хаками, но остаётся внешне таблицей. Например мы хотим хранить key:string=[множество-uint64]. Возможно для какой-то задачи, оптимально будет сохранить и на диске и в памяти структуру данных вида (key_len, key, потом тупо последовательность всех uint64 отсортированных). И рядом хеш-табличку по key возможно. Но если бы мы записывали это в таблицу, у нас бы было N число строк вида (key, uint64), где N - число разных uint64, а key бы повторялся. Сходу это выглядит неоптимальным, потому что кучу раз key повторили, но умная таблица не будет хранить повторяющиеся key и получится так же оптимально, как в наивном подходе и расположит всю таблицу прямо как в примере выше - не как последовательность кортежей (SEE_PREV_VALUE, uint64), а прям как один список (uint64, uint64, …., uint64). Я ж говорю - с хаками, но таблица.

А теперь вопрос. Предположим вы бекенд-C++-тимлид в каком-то инновационном банке (которому не жалко рискнуть наняв вас, а не поставив везде Oracle) или в каких-нибудь там одноклассниках или в гугло-яндексе. Тут давайте не будем вспоминать, что в этих организациях реально используется или говорить, что все они давно закоренели и там таких опытов не ставят, а работает YDB - пытаюсь показать масштаб.

  1. Предположим у вас есть C++ фреймворк, куда входит сетевой код принятия запросов (протокол-буфферс, например), какой-то движок хранения данных произвольного формата в файлах, код записи-воспроизвдеения WAL, код репликации, код статистики… И этот фреймворк позволяет за 20 минут под нужный формат данных наклепать на коленке новую «СУБД», написав буквально какой-то std::unordered_set в функции main() и «завернув» этот контейнер в данный фреймворк, выдав к нему доступ из сети и сериализацию/десериализацию на диск целиком и запись в WAL и т.п. То есть, к вам приходят люди, которые хотят хранить key=value, вы оформляете им новую «СУБД» с 2 методами - set и get и катите на прод, все юзают, все счастливы. Приходят другие люди, хотят по 64-битному числу хранить множество из миллиона других 64-битных чисел и искать в нём. Вы тоже быстро фигачите какую-то структуру данных на готовых контейнерах или даже достаёте из закромов какую-то свою супероптимальную, заврорачиваете в фреймворк, куяк-куяк и в продакшен. Не нужна какая-то СУБД - выкинули, не жалко, кода было мало.

  2. И у вас есть второй вариант: сделать один хороший табличный «движок». Все эти клиенты получают всегда одно и то же представление, один и тот же интерфейс (возможно даже SQL). В особо упоротых сценариях вы дорабатываете этот движок под их формат данных (доработка повышает эффективность использования памяти/диска данной таблицей) и эта доработка оформляется просто в отдельный типа индекса или в некое хитрое слово, указываемое на этапе CREATE TABLE.

По какому пути вы бы двигались и ПОЧЕМУ?

  1. Кажется достаточно симпатичным путём, потому что хотя каждая новая «СУБД» - снова какой-то велосипед, но трудозатраты смешны - описать центральную структуру данных, остальное готово. Более того, у сторонников супер-оптимизаций тут все козыри: мол вы в «табличном движке общего назначения» никогда не задрочитесь так, как можем мы, зная конкретную структуру данных пользователя. Что, кстати, спорно - не факт, что задрачивальщики решают какую-то реальную проблему.

  2. Выглядит тоже круто, поскольку многие моменты унифицируются. Тайм Ту Маркет ещё ниже - не надо даже ждать пока под твою структуру данных разраб почешется и напишет новый (хоть и крошечный) код, ты можешь уже сейчас CREATE TABLE и в 95% случаев тебе хватит. Не хватит - тогда и придёшь ныть-оптимизировать. Универсальные моменты: способы доступа, способы анализа, язык общения между командами (все говорят про таблицы, а не каждый про свою абстрактную опердень, выраженную в каждый раз новом C++ коде), способы конвертации данных (переливка между таблицами - это понятнее, чем писать конвертеры данных между одним форматом (1) и другим форматом (1) и т.п., проще дорабатывать всякие автоматические решардинги или переливаторы данных - один раз сделали для таблиц и работает у всех, не надо каждый раз думать как оригинальный формат данных (1) обрабатывать. В конце-концов, можно сделать DROP COLUMN, что в случае (1) оборачивается жестью и конвертацией старых данных).

Спасибо.



Последнее исправление: lesopilorama (всего исправлений: 1)
Ответ на: комментарий от alex0x08

Выпал зуб? - ставишь имплант.

Это и есть проблемы с зубами.

Искусственное сердце уже могут поставить а ты про какие-то зубы ноешь

Давай ты сбавишь градус борзости, папаша.

Существование искусственных сердец не уничтожает надобность ходить к стоматологу и ставить пломбы/коронки/импланты, тратя на это время и деньги. Не говоря уж о том, что вся эта возня с зубами психологически и физически неприятна. Какая тут вообще связь с искусственными сердцами? Да и в целом твоя логика похожа вот на эту шедевральную.

alex1101
()
Ответ на: комментарий от Calm

было замечено, что у нищуков зубы идеально ровные и куда менее проблемные, чем у детей из семей с достатком. Это исключило вариант с генетической предрасположенностью.

???

Если у тебя плохие зубы и ты богат, то тебе поможет стоматология. Если у тебя плохие зубы и ты нищ, то значительная вероятность того, что твоя ДНК до размножения не доживёт.

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

monk ★★★★★
()
Ответ на: комментарий от monk

Если у тебя плохие зубы и ты нищ, то значительная вероятность того, что твоя ДНК до размножения не доживёт.

Забавно, у меня есть знакомый, мягко говоря, очень небогатый, который в 35 лет имеет 1 (один) зуб - и у него где-то в Челябинске сын растёт.

Я вообще хз как оценивать вероятности, когда речь идёт о людях. Многие почему-то берут за исходный пункт какую-то недосягаемость женщин, но ведь среди женщин предостаточно особей, так скажем, нетоварного вида, которые рады прицепиться к любым «штанам в доме».

alex1101
()
Ответ на: комментарий от alex1101

Забавно, у меня есть знакомый, мягко говоря, очень небогатый, который в 35 лет имеет 1 (один) зуб - и у него где-то в Челябинске сын растёт.

Если он россиянин, то уже достаточно богат. Он богаче, чем примерно половина населения мира.

Многие почему-то берут за исходный пункт какую-то недосягаемость женщин

Речь не про женщин, а про то, что если у тебя основная еда достаточно жёсткая, а на более мягкую еду денег нет, то с плохими зубами быстро помрёшь.

у него где-то в Челябинске сын растёт

Один. То есть, аппроксимируя, количество таких людей каждое поколение уменьшается вдвое.

monk ★★★★★
()
Ответ на: комментарий от monk

Если он россиянин, то уже достаточно богат

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

Но твою мысль я понял. Хотя:

если у тебя основная еда достаточно жёсткая, а на более мягкую еду денег нет

мягкая еда это хлеб, макарохи, варёная картоха - и такая еда очень дёшева)

alex1101
()

Я бы посмотрел какие-то конкретные данные и что предлагают оба подхода. А то окажется, что физически на диске у обоих лежит то же самое (только у второго ещё метаинформация , которая впрочем, не зависит от количества данных). И тогда зачем оптимизации ради оптимизации.

KivApple ★★★★★
()
Ответ на: комментарий от alex1101

мягкая еда это хлеб, макарохи, варёная картоха - и такая еда очень дёшева)

Но только на такой долго не протянешь. Белковое голодание будет и авитаминоз. А с учётом того, что даже хлеб для нормального переваривания надо жевать, то ещё и проблемы с пищеварением.

мягкая еда это хлеб, макарохи, варёная картоха - и такая еда очень дёшева)

Я же пишу, мы очень богато живём. КНР в 1991 году торжественно объявил, что теперь у каждого китайца есть чашка риса в день. Сейчас китайцы живут почти как россияне, но более миллиарда человек не могут себе позволить даже чашку риса в день.

monk ★★★★★
()
Ответ на: комментарий от monk

мы очень богато живём

Ну, с «очень» я не соглашусь, но в целом да, нам относительно повезло, что мы родились там где родились.

У меня кент ездил на вахту в Бангладеш, там просто жопа. Причём там людей больше, чем в России.

Сейчас китайцы живут почти как россияне

Насколько я знаю, большинство китайцев и сейчас живут в куда более жёстких условиях, чем даже жители российской глубинки. Там местами буквально борьба за выживание. У нас жизнь намного более расслабленная. Если у тебя нет амбиций - можешь особо и не напрягаться.

alex1101
()